SQL情况下使用子字符串时出现错误

时间:2019-02-17 09:14:25

标签: sql-server tsql

在通过CASE函数调用使用SQL Server SUBSTRING语句时遇到错误:

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) + '%'

我收到此错误:

  

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

我做错什么了吗?请让我知道

2 个答案:

答案 0 :(得分: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 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

答案 1 :(得分:0)

sys.Operating_System_Name_and0区分大小写。所以案例陈述应该像

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