案件陈述在哪里条件

问题描述 投票:0回答:1

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

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
sql-server-2012 sql-like case-statement
1个回答
1
投票

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

您描述的逻辑可以使用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将返回与使用=相同的结果,因此整个事情可以像这样写

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:
© www.soinside.com 2019 - 2024. All rights reserved.