【问题标题】:Strange issue combining IF and CASE in TSQL query在 SQL 查询中结合 IF 和 CASE 的奇怪问题
【发布时间】:2020-07-09 03:41:37
【问题描述】:

这是一个看起来应该是一个简单的解决方案的问题,但我已经研究了一段时间,但无法弄清楚为什么我似乎无法在查询的一个区域中将 CASE 和在另一个区域中的 IF 结合起来。

有人看到这里发生了什么吗?我有一个旧数据集需要转换才能使用新表。数据从 WDDX 中提取并放入临时表中。这一切都正常工作。

这是我遇到麻烦的地方。我需要在出现 XXXX 时将一个值提取到一个名为 DetailValue 的新列中,在这种情况下,XXXX 之后出现的值是属于 DetailValue 的数字,然后是 _,在这种情况下,出现在之后的数字_ 属于 RiskValue.. 另外,当 ZZZZ 出现时,后面的字符属于 DetailValue,它始终是最后一个字符。

当它只是 CASE 时,一切正常,但是当我添加 IF 来获取一个值时,它告诉我:

“关键字 'IF' 附近的语法不正确。消息 156,级别 15,状态 1,过程 OldSysDataConv 关键字 'THEN' 附近的语法不正确。

代码是:

 SELECT VarName, 
 CASE 
   WHEN (CHARINDEX('XXXX', VarName) > 0 and SUBSTRING(VarName, CHARINDEX('XXXX', VarName), len(VarName)) like '%XXXX%') or SUBSTRING(VarName, CHARINDEX('ZZZZ', VarName), len(VarName)) like '%ZZZZ%' then

    left(replace(left(replace(VarName, 'XXXX', ''), len(VarName)-4), 'ZZZZ', ''), (len(VarName)-5))
else
    null
END as DetailName,
IF CHARINDEX('ZZZZ', VarName) > 0 THEN
    right(VarName, 1)
END
 as DetailValue,

【问题讨论】:

    标签: sql sql-server tsql if-statement case


    【解决方案1】:

    在纯 SQL 中没有 IF ... THEN ... END 表达式 这样的东西。这是在存储过程中使用的过程语句

    您需要IIF(),这是特定于 T-SQL 的:

    IIF(CHARINDEX('ZZZZ', VarName) > 0, right(VarName, 1), null) as DetailValue
    

    或者更标准的CASE

    CASE WHEN CHARINDEX('ZZZZ', VarName) > 0 THEN right(VarName, 1) END as DetailValue
    

    【讨论】:

    • 如何在 CASE 中考虑这些多重条件?我不知道有什么办法。我希望能够将 IIF 放在 CASE ELSE 下。我确实需要将这些结合起来。如果我不这样做,则 SQL Server 决定在我的结果集中创建单独的列。
    【解决方案2】:

    我通过简化 CASE 语句解决了我自己的问题。在漫长的一天中,一些基本的逻辑从我身边溜走了。 ;)

    答案:

     CASE
     WHEN CHARINDEX('XXXX', VarName) > 0 AND CHARINDEX('ZZZZ', VarName) <> 0 THEN
        substring(VarName, (CHARINDEX('_', VarName)-1), len(VarName))
     ELSE
         right(VarName, 1)
     END
     as DetailValue,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多