我需要在查询中使用嵌套的case结构,外壳使用IN运算符。我在外壳的所有条件下都使用了相同的内壳部件,如下例所示:
SELECT
CASE
WHEN
(CASE
WHEN expression1 THEN value1
WHEN expression2 THEN value2
ELSE value3
END) in (1, 2)
THEN 'A'
WHEN
(CASE
WHEN expression1 THEN value1
WHEN expression2 THEN value2
ELSE value3
END) in (3, 4)
THEN 'B'
ELSE 'C'
END
该示例效果很好,但如果可能,我想按如下方式使用它:
SELECT
CASE
(CASE
WHEN expression1 THEN value1
WHEN expression2 THEN value2
ELSE value3
END)
WHEN
an_alias_if_necessary in (1, 2)
THEN 'A'
WHEN
an_alias_if_necessary in (3, 4)
THEN 'B'
ELSE 'C'
END
以下没有IN运算符的嵌套大小写的示例效果很好。是否可以使用与IN运算符相同的结构?
SELECT
CASE
(CASE
WHEN expression1 THEN value1
WHEN expression2 THEN value2
ELSE value3
END)
WHEN asked_value1 THEN 'A'
WHEN asked_value2 THEN 'B'
ELSE 'C'
END
答案 0 :(得分:1)
PostgreSQL不支持SQL标准功能“简单CASE表达式中的逗号分隔谓词”(F263),因此您不能这样做。
您必须使用如下构造:
CASE CASE
WHEN expression1 THEN value1
WHEN expression2 THEN value2
ELSE value3
END
WHEN 1 THEN 'A'
WHEN 2 THEN 'A'
WHEN 3 THEN 'B'
WHEN 4 THEN 'B'
ELSE 'C'
END
答案 1 :(得分:0)
您似乎需要使用VALUES(1,2)
imediate 表
SELECT
topic_id
,krant_id
, CASE WHEN (krant_id IN (SELECT val FROM (VALUES(1),(2) ) vals(val)))THEN 'OneTwo' ELSE 'Normal' END AS label
FROM react
WHERE react_date >= '2011-01-01'
AND react_date < '2011-02-01'
;
将VALUES()
放入CTE可以简化查询:
WITH vals(val) AS (VALUES(1),(2))
SELECT
topic_id
,krant_id
, CASE WHEN (krant_id IN (SELECT val FROM vals)) THEN 'OneTwo' ELSE 'Normal' END AS label
FROM react
WHERE react_date >= '2011-01-01'
AND react_date < '2011-02-01'
;
抱歉,我使用了自己现有的表格。但是语法是正确的。