【问题标题】:using > in case statement causes syntax error使用 > in case 语句会导致语法错误
【发布时间】:2015-08-17 13:02:09
【问题描述】:

使用下面的代码在“>”附近给出了错误的语法,Long 字段中的数据如下所示:

Review Body 3,
Review body 6,
Aprentice,

我已经在圈子里转了几个小时来整理这个,是不是因为我在计算中使用了文本函数(右)。

SELECT TOP 1000 [Id]
      ,[Short]
      ,[Long]
      ,CASE ISNUMERIC(RIGHT( grade.Long , 1 )) WHEN  cast(RIGHT( shiftname.Long , 1 )as int) > 4  THEN 'Qualified' ELSE 'Unqualified' END  as Grade

  FROM [RosterPro_Live].[dbo].[lookup_PostGrade] as grade

【问题讨论】:

  • 你能给一些ddl吗?什么是 shiftname?
  • ISNUMERIC返回 1 或 0,所以我不明白 WHEN 之后的部分
  • 您正在混合 CASE 语法变体。要么你有CASE expression WHEN value THEN ... WHEN othervalue THEN ... CASE WHEN expression THEN ... WHEN otherexpression THEN ...。您不能同时提供 CASE 之后的表达式和 WHEN 之后的表达式(除非 WHEN 之后的表达式产生与 CASE 之后的表达式相对应的值)。
  • 所以,你检查grade.Long的最后一个字符是否可以转换为任何数字类型,然后尝试将cast一个不同列最右边的字符转换为int?此外,ISNUMERIC 很少(如果有的话)是任何问题的正确解决方案。

标签: sql-server tsql casting sql-server-2008-r2 case


【解决方案1】:

在句法上,如 L.V. Karlsen 表示,这个问题与SQL Server CASE .. WHEN .. expressionCASE Statement SQL 2012 重叠。

您的问题不够清楚,但在这个 CASE(双关语的意思)中,看起来您实际上可能想要嵌套两个 CASE 表达式并使用 CASE 语法的 BOTH 变体:

SELECT TOP 1000 [Id]
  ,[Short]
  ,grade.[Long]
  ,CASE ISNUMERIC(RIGHT( grade.Long , 1 )) 
    WHEN 1 THEN
        CASE WHEN  cast(RIGHT( shiftname.Long , 1 )as int) > 4  THEN 'Qualified' ELSE 'Unqualified Shift' END  
    WHEN 0 THEN 
        'Unqualified Grade'
    END                                                                                 as Grade
FROM [dbo].[lookup_PostGrade] as grade
-- assume join to shiftname is missing    

请注意,WHEN 0 可能是 ELSE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多