¿Hay alguna manera de hacer que el caso cuando se prueba uno de los resultados en lugar de ejecutarlo dos veces?

StackOverflow https://stackoverflow.com/questions/854747

  •  21-08-2019
  •  | 
  •  

Pregunta

¿Hay una manera de utilizar el valor de la caja cuando la prueba como uno de sus resultados sin tener que escribir la instrucción de selección dos veces (ya que podría ser largo y desordenado)? Por ejemplo:

 SELECT id,
     CASE WHEN (
         (SELECT MAX(value) FROM my_table WHERE other_value = 1) IS NOT NULL
     )
     THEN (
         SELECT (MAX(value) FROM my_table WHERE other_value = 1
     ) 
     ELSE 0
 END AS max_value
     FROM other_table

¿Hay alguna manera de utilizar el resultado de la primera ejecución de la instrucción SELECT (para la prueba) como el valor ENTONCES así? He intentado utilizar "AS MAX_VALUE" después de la primera SELECT pero me dio un error de SQL.

Actualizar : Vaya, como Tom H. señaló, se me olvidó el "no es nulo" en mi pregunta original

.
¿Fue útil?

Solución

Este ejemplo muestra cómo se puede preparar un grupo de valores en una subconsulta, y utilizarlos en un caso en el SELECT externa.

select
    orderid,
    case when maxprice is null then 0 else maxprice end as maxprice
from (
    select
        orderid = o.id,
        maxprice = (select MAX(price) from orderlines ol 
                    where ol.orderid = o.id)
    from orders o
) sub

No estoy seguro si eso es lo que está buscando, la pregunta no es clara (por ejemplo, el 2 MAX () consultas parecen ser copias exactas.)

Otros consejos

¿Su declaración aún funciona? No es una expresión booleana en su sentencia CASE. Lo hace por defecto de MySQL para la comprobación de valor nulo si no se utiliza un valor lógico?

Creo que esto es probablemente lo que usted está buscando:

SELECT
     id,
     COALESCE(
     (
          SELECT
               MAX(value)
          FROM
               My_Table
          WHERE
               other_value = 1
     ), 0) AS max_value
FROM
     Other_Table
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top