在 CASE 表达式中分配子查询的值

Assign value of subquery inside a CASE expression

我想得到一个值,如果它存在,如果它不存在我想return一个随机数(它比那个更复杂一点,但这就是它的本质)。

我认为我的查询看起来像这样:

SELECT 
    something, 
    CASE
        WHEN EXISTS (SELECT column_1 FROM table_1 WHERE something)  
            THEN column_1
            ELSE RANDOM()
    END;

这显然是无效的。

我使用 Postgresql,我在 plpgsql 函数中。

我该怎么办?

找到了!

使用 COALESCE 我可以这样做:

SELECT something, CΟALESCE((SELECT column_1 FROM table_1 WHERE something), RANDOM())

当第一个查询没有return某事时,RANDOM领先。

您不能从 EXISTS 条件中引用该列,因为它只会产生 true 或 false。来自子查询的 SELECTed 列也被完全忽略。

所以需要在THEN部分重复SELECT得到列值:

SELECT 'something' as one_column, 
       CASE
         WHEN EXISTS (SELECT * 
                      FROM table_1 
                      WHERE <some_condition>) 
           THEN (select column_1 from table_1 where <some_condition>)
         ELSE random()
       END as other_column;

注意 THEN 分支中 SELECT 周围的括号。他们有必要将其标记为标量查询。您还需要确保 some_condition 只有 returns 一行