where 条件下的 case 语句

case statement in where condition

在下面的脚本中,它显示“关键字 'LIKE' 附近的语法不正确”。我正在使用 CASE 语句检查 F_TEXT_CODE>10 的长度。如果它的长度>10,那么我使用 like 运算符,如果它小于 10,我使用 '=' 运算符。 如何在where条件下实现这个逻辑?

DECLARE
@MANU NVARCHAR(4000)='MANU0071'
BEGIN
SELECT   TOP 1000 TP.F_PRODUCT AS ID,
         TP.F_PRODUCT_NAME AS NAME
        FROM PDF_DETAILS TP
    LEFT JOIN V_PROD_ALIAS_MANU MAN ON MAN.F_PRODUCT = TP.F_PRODUCT
    WHERE TP.F_PRODUCT<>''AND 
        (CASE WHEN LEN(MAN.F_TEXT_CODE)>10 THEN
    (MAN.F_TEXT_CODE) LIKE @MANU 
    ELSE MAN.F_TEXT_CODE = @MANU END) AND 
       (TP.F_CUSTOM5 IS NULL OR TP.F_CUSTOM5 = '') 

END

你不能那样使用 case
case 是一个表达式,return 是一个基于条件的标量值。
它不能用作流量控制元素。

您描述的逻辑可以使用 orand 的组合来完成:

DECLARE @MANU NVARCHAR(4000)='MANU0071'
BEGIN
SELECT   TOP 1000 TP.F_PRODUCT AS ID,
         TP.F_PRODUCT_NAME AS NAME
        FROM PDF_DETAILS TP
    LEFT JOIN V_PROD_ALIAS_MANU MAN ON MAN.F_PRODUCT = TP.F_PRODUCT
    WHERE TP.F_PRODUCT<>''
    AND 
    ( 
        (LEN(MAN.F_TEXT_CODE)>10 AND MAN.F_TEXT_CODE LIKE @MANU)
        OR
        (LEN(MAN.F_TEXT_CODE)<=10 AND MAN.F_TEXT_CODE = @MANU)
    ) 
    AND 
       (TP.F_CUSTOM5 IS NULL OR TP.F_CUSTOM5 = '') 
END

但是请注意,使用 like 不带任何通配符将 return 与使用 = 的结果相同,因此整个内容可以这样写

DECLARE @MANU NVARCHAR(4000)='MANU0071'
BEGIN
SELECT   TOP 1000 TP.F_PRODUCT AS ID,
         TP.F_PRODUCT_NAME AS NAME
        FROM PDF_DETAILS TP
    LEFT JOIN V_PROD_ALIAS_MANU MAN ON MAN.F_PRODUCT = TP.F_PRODUCT
    WHERE TP.F_PRODUCT<>''
    AND 
    AND MAN.F_TEXT_CODE = @MANU
    AND 
       (TP.F_CUSTOM5 IS NULL OR TP.F_CUSTOM5 = '') 

END: