根据两个表选择CASE语句

时间:2015-11-16 18:21:58

标签: sql sql-server select case

MS SQL Server 2008R2 Management Studio

我在两张桌子上运行SELECT。我会将它简化为我遇到麻烦的部分。我需要将SELECT结果修改为某种格式以进行数据导入。我的CASE语句正常工作,直到我需要将WHEN ... THEN...基于不同的表列

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

我尝试添加:

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

但它不起作用。

3 个答案:

答案 0 :(得分:2)

您可以使用稍微更健壮的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

答案 1 :(得分:1)

你很亲密,但我认为这正是你要找的。他们在不同的表格中的事实对CASE来说并不重要,只是加入:

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

答案 2 :(得分:1)

我还不能对帖子发表评论。但是,如果你要改变描述,为什么还要有一个包含代码描述的代码表呢?相反,您应该只修改该表中的当前描述,或者添加一个包含所需辅助描述的列。然后案例陈述要复杂得多。

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