在 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 一行
我想得到一个值,如果它存在,如果它不存在我想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 一行