0

有没有办法使用 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 错误。

更新:哎呀,正如 Tom H. 指出的那样,我在原来的问题中忘记了“IS NOT NULL”。

4

2 回答 2

5

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

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

SELECT
     id,
     COALESCE(
     (
          SELECT
               MAX(value)
          FROM
               My_Table
          WHERE
               other_value = 1
     ), 0) AS max_value
FROM
     Other_Table
于 2009-05-12T20:44:06.223 回答
4

这个例子展示了如何在子查询中准备一堆值,并在外部 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() 查询似乎是精确的副本。)

于 2009-05-12T20:45:12.510 回答