【问题标题】:select CASE statement based on two tables基于两个表的select CASE语句
【发布时间】:2015-11-16 18:21:57
【问题描述】:

MS SQL Server 2008R2 管理工作室

我在两张桌子上运行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'

但是没有用。

【问题讨论】:

  • 你可以嵌套case语句。这很丑陋,但可行。基本上相当于嵌套的if(if())
  • case when table1.tag = 'Y' then 'Other string' else (case codes.desc when 'string1' then 'String 1' when ... end) end - 不知道是否你需要括号,但至少它有助于阅读
  • 您不需要括号,但它们也不会造成任何伤害。

标签: sql sql-server select case


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我还不能对帖子发表评论。但是,如果您要更改描述,为什么还要有一个带有代码描述的代码表呢?相反,您应该只修改该表中的当前描述或添加一个包含您需要的辅助描述的列。那么 case 语句就不会那么复杂了。

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

    【讨论】:

    • 那是有道理的,但那部分是我无法控制的
    • 这个答案和史蒂夫的答案相似,这种格式对我有用。谢谢
    【解决方案3】:

    你很接近,但我认为这就是你要找的。它们在不同表中的事实对于 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
    

    【讨论】:

      猜你喜欢
      • 2021-01-05
      • 2023-04-07
      • 2021-12-05
      • 1970-01-01
      • 2013-03-23
      • 2014-12-05
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      相关资源
      最近更新 更多