繁体   English   中英

有没有办法让CASE WHEN测试其中一个结果,而不是运行两次?

[英]Is there a way I can make the CASE WHEN test one of the results rather than running it twice?

有没有一种方法可以将CASE WHEN测试中的值用作其结果之一,而无需两次写出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值? 我在第一个SELECT之后尝试使用“ AS max_value”,但它给了我一个SQL错误。

更新 :糟糕,正如汤姆·H(Tom H.)所指出的,我忘记了原始问题中的“ IS NOT NULL”。

您的陈述是否还运行? 它不是CASE语句中的布尔表达式。 如果您不使用布尔值,MySQL是否默认检查NULL值?

我认为这可能是您要寻找的:

SELECT
     id,
     COALESCE(
     (
          SELECT
               MAX(value)
          FROM
               My_Table
          WHERE
               other_value = 1
     ), 0) AS max_value
FROM
     Other_Table

本示例说明如何在子查询中准备一堆值,并在外部SELECT的CASE中使用它们。

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()查询似乎是完全相同的副本。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM