【问题标题】:SQL case giving error while using substring使用子字符串时 SQL 案例给出错误
【发布时间】:2019-02-17 09:14:24
【问题描述】:

我在使用带有 SUBSTRING 函数调用的 SQL Server CASE 语句时遇到错误:

DECLARE @string VARCHAR(MAX)

SELECT 
     sys.Netbios_Name0, sys.name0, sys.Operating_System_Name_and0,
     sys.AD_Site_Name0, sys1.DisplayName0, sys1.Version0,
     sys2.TopConsoleUser0, sys3.model0,
     CASE sys.Operating_System_Name_and0
        WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '6.3' 
           THEN 'Windows 8' 
        WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '6.2' 
           THEN 'Windows 8' 
        WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '6.1'  
           THEN 'Windows 7' 
        WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '6.0'  
           THEN 'Windows Vista' 
        WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '5.2' 
           THEN 'Windows XP' 
        WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '5.0' 
           THEN 'Windows 2000' 
        ELSE 'sys.Netbios_Name0' 
     END AS WindowsVersion
FROM
    fn_rbac_Add_Remove_Programs(1) sys1 
INNER JOIN  
    v_r_system sys ON sys.ResourceID = sys1.ResourceID  
LEFT OUTER JOIN 
    v_GS_COMPUTER_SYSTEM sys3 ON sys1.ResourceID = sys3.ResourceID
LEFT OUTER JOIN 
    v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP sys2 ON sys.Resourceid = sys2.ResourceID 
-- WHERE sys1.DisplayName0 LIKE '%' + @prodname + '%' AND sys1.version0 LIKE CONVERT(VARCHAR(10), @variable) + '%'

我收到此错误:

消息 102,第 15 级,状态 1,第 6 行
'=' 附近的语法不正确。

我做错了吗?请告诉我

【问题讨论】:

  • 使用 sys 作为别名似乎是个坏主意,因为它是每个数据库中的模式。

标签: sql-server tsql


【解决方案1】:

您正在混合case 表达式的两种可能的语法选项。

一个存在:

CASE input_expression   
     WHEN when_expression THEN result_expression [ ...n ]   
     [ ELSE else_result_expression ]   
END   

另一个是:

CASE  
     WHEN Boolean_expression THEN result_expression [ ...n ]   
     [ ELSE else_result_expression ]   
END  

您可以在同一个case 表达式中使用第一个或第二个,但不能同时使用。

由于when 部分中的所有表达式都是
sys.SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = <some value>,因此可以使用第一个选项编写您的 case 表达式:

 CASE sys.SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0)
    WHEN '6.3' 
       THEN 'Windows 8' 
    WHEN '6.2' 
       THEN 'Windows 8' 
    WHEN '6.1'  
       THEN 'Windows 7' 
    WHEN '6.0'  
       THEN 'Windows Vista' 
    WHEN '5.2' 
       THEN 'Windows XP' 
    WHEN '5.0' 
       THEN 'Windows 2000' 
    ELSE 'sys.Netbios_Name0' 
 END AS WindowsVersion

【讨论】:

    【解决方案2】:

    sys.Operating_System_Name_and0 大小写冗余。所以case语句应该是这样的

    SELECT ...
    CASE /*comment col name here*/
    WHEN substring(...) = ...
    .... 
    

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      相关资源
      最近更新 更多