【问题标题】:Nested CASE ELSE END Syntax Error嵌套 CASE ELSE END 语法错误
【发布时间】:2016-10-25 00:54:10
【问题描述】:

谁能告诉我为什么我在最后一个 ELSE 语句中收到了不正确的语法错误。

SELECT 
CASE WHEN PolType = 'PKG' THEN 

    CASE WHEN PkgDef & 1 = 1 THEN 'BA ' ELSE

    CASE WHEN PkgDef & 2 = 2 THEN 'BAT' ELSE

    CASE WHEN PkgDef & 4 = 4 THEN 'GS ' ELSE

    CASE WHEN PkgDef & 8 = 8 THEN 'DLR' ELSE

    'ERR' END 
ELSE 
    poltype 
END AS 'PolType'

FROM Parallel_Test.dbo.PolicyG 
WHERE rowid = (SELECT MAX(rowid) FROM Parallel_Test.dbo.policyg) - 10

【问题讨论】:

  • 这是用于 MSSQL、MySQL 还是什么?请告诉我们您使用的是什么 SQL。
  • (Sql Server 2008) 这个语句有4层嵌套Case语句是你的本意吗?

标签: sql sql-server


【解决方案1】:

如果您使用的是 Microsoft SQL Server,那么您可能会尝试这样做:

SELECT 
CASE 
    WHEN PolType = 'PKG' THEN
        CASE 
            WHEN PkgDef & 1 = 1 THEN 'BA ' 
            WHEN PkgDef & 2 = 2 THEN 'BAT' 
            WHEN PkgDef & 4 = 4 THEN 'GS ' 
            WHEN PkgDef & 8 = 8 THEN 'DLR' 
        ELSE 'ERR' 
        END 
    ELSE poltype 
END AS 'PolType'

FROM Parallel_Test.dbo.PolicyG 
WHERE rowid = (SELECT MAX(rowid) FROM Parallel_Test.dbo.policyg) - 10

如果我错误地解释了您的预期逻辑,请告诉我。

【讨论】:

  • 完美,感谢所有回复的人。非常感谢!
【解决方案2】:

不是testet,而是尝试:

SELECT CASE WHEN PolType <> 'PKG' THEN poltype
WHEN PkgDef & 1 = 1 THEN 'BA '
WHEN PkgDef & 2 = 2 THEN 'BAT'
WHEN PkgDef & 4 = 4 THEN 'GS '
WHEN PkgDef & 8 = 8 THEN 'DLR'
ELSE 'ERR'
END AS 'PolType'
FROM Parallel_Test.dbo.PolicyG 
WHERE rowid = (SELECT MAX(rowid) FROM Parallel_Test.dbo.policyg) - 10

【讨论】:

    【解决方案3】:

    这就是您的 case 语句目前实际在做的事情(4 层嵌套 if) 我在另一个“结尾”中添加了您需要更正陈述的内容。 (我确实认为您正在寻找其他解决方案之一)

        CASE 
            WHEN PkgDef & 1 = 1 THEN 'BA ' 
            ELSE CASE 
                    WHEN PkgDef & 2 = 2 THEN 'BAT' 
                    ELSE CASE 
                            WHEN PkgDef & 4 = 4 THEN 'GS ' 
                            ELSE CASE 
                                WHEN PkgDef & 8 = 8 THEN 'DLR' 
                                ELSE 'ERR' 
                                END 
                        end
                end
    
    END AS 'PolType'
    
    FROM Parallel_Test.dbo.PolicyG 
    WHERE rowid = (SELECT MAX(rowid) FROM Parallel_Test.dbo.policyg) - 10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2018-08-16
      • 2019-06-10
      相关资源
      最近更新 更多