T-SQL CASE语句依赖于同一SELECT查询中的另一个CASE语句

时间:2013-05-07 09:59:59

标签: sql sql-server tsql case

我有一个SELECT查询,其中第二个CASE语句的结果可能取决于第一个CASE语句的结果 - 如:

SELECT      ..., 
            CASE 
                WHEN dbo.Table1.Description LIKE '%car%' THEN 'Car'
                WHEN ... 
                ELSE 'Unclassified'
            END AS Product, 
            CASE 
                WHEN dbo.Table2.Description LIKE '%my%brand%' THEN 'Branded'
                WHEN Product='Unclassified' THEN 'Unclassified'
                ELSE 'Generic'
            END AS Brand,
            ...
FROM        ...

如果查询无法在描述列中找到品牌名称且“产品”列也已确定具有“未分类”值,则“品牌”为“未分类”。目前,该声明仅输出'品牌'或'通用'品牌类型。即使Product是'Unclassified',它仍然会给出'Generic',这不是我需要的输出。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

SELECT子句的结果是并行计算的(就像它们被评估一样) - 因此,一列的值不能依赖于另一列。解决方案是引入CTE或子查询,以便您有多个SELECT子句:

SELECT
    ...,
    CASE 
        WHEN t.T2Description LIKE '%my%brand%' THEN 'Branded'
        WHEN Product='Unclassified' THEN 'Unclassified'
        ELSE 'Generic'
    END AS Brand
FROM (
    SELECT      ..., 
        CASE 
            WHEN dbo.Table1.Description LIKE '%car%' THEN 'Car'
            WHEN ... 
            ELSE 'Unclassified'
        END AS Product, 
        dbo.Table2.Description as T2Description,
        ...
    FROM        ...
) t