#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. Рад помочь 🙂