select 基于两个表的CASE语句

select CASE statement based on two tables

MS SQL Server 2008R2 Management Studio

我是 运行 两个 table 的 SELECT。我会将其简化为遇到问题的部分。我需要将 SELECT 结果修改为特定格式以进行数据导入。我的 CASE 语句工作正常,直到我需要将 WHEN ... THEN... 基于不同的 table 列

TABLE1
-----------------
name   |  tag   | code
-----------------------
name1  |   N    | 100
name2  |   N    | 100
name3  |   N    | 200
name4  |   Y    | 100
name5  |   N    | 400
name6  |   N    | 700

CODES
-------------------------
code |   desc
-------------------------
100 | string1
200 | string2
300 | string2
400 | string2
700 | string2

SELECT name,
Case CODES.desc
when 'string1' then 'String 1'
when 'string2' then 'String 2'
when 'string3' then 'String 3'
when 'string4' then 'String 4'
END as description
FROM TABLE1
join CODES on TABLE1.code = CODES.code

这很好用。问题是如果 TABLE1.tag = Y,那么描述需要是 'Other string' 而不是 CODES table

我尝试添加:

Case CODES.desc
.....
when TABLE1.tag = Y then CODES.desc 'Other String'

但是没用。

您可以使用稍微更健壮的 case 语法并将案例表示为条件,而不仅仅是可能的值:

SELECT name,
       CASE WHEN table1.tag = 'Y' THEN 'other string'
            WHEN codes.[desc] = 'string1' THEN 'String 1'
            WHEN codes.[desc] = 'string2' THEN 'String 2'
            WHEN codes.[desc] = 'string3' THEN 'String 3'
            WHEN codes.[desc] = 'string4' THEN 'String 4'
       END AS description
FROM   table1
JOIN   codes ON table1.code = codes.code

你很接近,但我认为这就是你要找的。它们在不同表中的事实对 CASE 来说并不重要,只是 JOIN:

SELECT name,
Case WHEN Table1.tag = 'Y'
 then CODES.Desc
 ELSE 'Other String'
 END as description
FROM TABLE1
join CODES on TABLE1.code = CODES.code

我还不能对 post 发表评论。但是,如果您无论如何都要更改描述,为什么要使用代码 table 和代码描述呢?相反,您应该只修改 table 中的当前描述或添加一个包含您需要的次要描述的列。那么case语句就不那么复杂了。

    CASE WHEN TABLE1.tag = 'Y'
    THEN 'Other String'
    ELSE CODES.other_desc
    END AS description