SQL Server 中的嵌套 case 语句

问题描述 投票:0回答:2

我正在尝试执行嵌套的 case 语句,当初始 case 语句中的条件未执行时,这些语句将被执行。我收到错误“无效的列名-initial_case_output”。任何建议将不胜感激。

SELECT
    ZTYPE_TRF, 
    CASE WHEN type = '4' THEN N'ABC'
         WHEN type = '3' THEN N'DEF'
    END AS initial_case_output,
    (CASE 
       WHEN b.SC = 'D2' then N'DEF'
       WHEN b.SC = 'D5' then N'GHI'
     ELSE initial_case_output
    END) AS ZTYPE_NEW
 FROM report a left join  table2 b
 on a.BA = b.BA;
sql sql-server case
2个回答
0
投票

如果您将计算包装在

CROSS APPLY
中,则可以在查询中的其他位置引用结果。

SELECT
    ZTYPE_TRF, 
    CA.initial_case_output,
    (CASE 
       WHEN b.SC = 'D2' then N'DEF'
       WHEN b.SC = 'D5' then N'GHI'
     ELSE CA.initial_case_output
    END) AS ZTYPE_NEW
FROM report a
LEFT JOIN table2 b ON a.BA = b.BA
CROSS APPLY (
    SELECT
        CASE
            WHEN type = '4' THEN N'ABC'
            WHEN type = '3' THEN N'DEF'
            END AS initial_case_output
) CA;

甚至:

SELECT
    ZTYPE_TRF, 
    CA1.initial_case_output,
    CA2.ZTYPE_NEW
FROM report a
LEFT JOIN table2 b ON a.BA = b.BA
CROSS APPLY (
    SELECT
        CASE
            WHEN type = '4' THEN N'ABC'
            WHEN type = '3' THEN N'DEF'
            END AS initial_case_output
) CA1
CROSS APPLY (
    SELECT
        CASE 
            WHEN b.SC = 'D2' then N'DEF'
            WHEN b.SC = 'D5' then N'GHI'
            ELSE CA1.initial_case_output
            END AS ZTYPE_NEW
) CA2;

0
投票

该错误是因为 CASE 语句试图在定义之前访问

initial_case_output
。您需要将查询分解为子查询才能访问别名。 SELECT 子句中定义的别名在同一 SELECT 子句中不可用。

这里有一个更好的方法来解决这个问题:

SELECT
a.ZTYPE_TRF,
initial_case_output,
(CASE
    WHEN b.SC = 'D2' THEN N'DEF'
    WHEN b.SC = 'D5' THEN N'GHI'
    ELSE initial_case_output
END) AS ZTYPE_NEW
FROM
    (
        SELECT
            ZTYPE_TRF,
            CASE
                WHEN type = '4' THEN N'ABC'
                WHEN type = '3' THEN N'DEF'
            END AS initial_case_output
        FROM
            report
    ) a
    LEFT JOIN table2 b ON a.BA = b.BA;

PS。我不知道您正在使用的确切变量和表格,但这是解决问题的总体思路。

© www.soinside.com 2019 - 2024. All rights reserved.