заявление в случае, когда условие - PullRequest
0 голосов
/ 01 апреля 2019

В приведенном ниже скрипте он показывает «Неверный синтаксис рядом с ключевым словом« 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

1 Ответ

1 голос
/ 01 апреля 2019

Вы не можете использовать 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:
...