оператор case в условии where

#sql-server-2012 #sql-like #case-statement

#sql-server-2012 #sql-подобный #оператор обращения

Вопрос:

В приведенном ниже сценарии отображается «Неправильный синтаксис рядом с ключевым словом «LIKE».я использую оператор CASE для проверки длины F_TEXT_CODE>10. ЕСЛИ это длина> 10, то я использую оператор like, если она меньше 10, я использую оператор ‘=’. как достичь этой логики в where condition?.

 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
  

Ответ №1:

Вы не можете использовать case таким образом.
case это выражение, которое возвращает скалярное значение на основе условия (ов).
Его нельзя использовать в качестве элемента управления потоком.

Логика, которую вы описываете, может быть выполнена с использованием комбинации or и and :

 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:
  

Комментарии:

1. я использую ‘%MANU0071%’ во входном параметре. я забыл упомянуть во входном параметре

2. Таким образом, вы можете использовать, replace(@MANU, '%', '') когда вы хотите = , а не like

3. Спасибо. я попробую это.

4. Рад помочь 🙂