Есть ли способ, которым я могу сделать ТАК, чтобы протестировать один из результатов, а не запускать его дважды?

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

  •  21-08-2019
  •  | 
  •  

Вопрос

Есть ли способ использовать значение из CASE WHEN test в качестве одного из его результатов, не записывая оператор select дважды (поскольку это может быть длинным и беспорядочным)?Например:

 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

Есть ли способ, которым я могу использовать результат первого запуска инструкции SELECT (для теста) также в качестве значения THEN?Я попытался использовать "КАК max_value" после первого выбора, но это выдало мне ошибку SQL.

Обновить:Упс, в роли Тома Х.обратите внимание, я забыл "НЕ РАВНО НУЛЮ" в моем первоначальном вопросе.

Это было полезно?

Решение

Этот пример показывает, как вы можете подготовить набор значений в подзапросе и использовать их в СЛУЧАЕ внешнего выбора.

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

Не уверен, что это то, что вам нужно, вопрос неясен (например, ваши 2 запроса MAX () выглядят точными копиями.)

Другие советы

Выполняется ли вообще ваше заявление?Это не логическое выражение в вашем операторе CASE.Проверяет ли MySQL по умолчанию нулевое значение, если вы не используете логическое значение?

Я думаю, что это, вероятно, то, что вы ищете:

SELECT
     id,
     COALESCE(
     (
          SELECT
               MAX(value)
          FROM
               My_Table
          WHERE
               other_value = 1
     ), 0) AS max_value
FROM
     Other_Table
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top