在PostgreSQL中的嵌套大小写中使用IN运算符

时间:2018-02-21 11:40:59

标签: postgresql

我需要在查询中使用嵌套的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

2 个答案:

答案 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'
        ;

抱歉,我使用了自己现有的表格。但是语法是正确的。