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 是一个基于条件的标量值。
它不能用作流量控制元素。
您描述的逻辑可以使用 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
不带任何通配符将 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:
在下面的脚本中,它显示“关键字 '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 是一个基于条件的标量值。
它不能用作流量控制元素。
您描述的逻辑可以使用 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
不带任何通配符将 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: