Bry*_*oth 191 sql t-sql sql-server
是否可以在MS SQL中的WHERE子句中使用IF子句?
例:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
Run Code Online (Sandbox Code Playgroud)
bdu*_*kes 204
使用CASE语句
更新:以前的语法(由少数人指出)不起作用.您可以按如下方式使用CASE:
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber) = 1 THEN
@OrderNumber
ELSE
'%' + @OrderNumber
END
Run Code Online (Sandbox Code Playgroud)
或者您可以使用像@ NJ Reed指出的IF语句.
njr*_*101 131
您应该能够在没有任何IF或CASE的情况下执行此操作
WHERE
(IsNumeric(@OrderNumber) AND
(CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR)
OR
(NOT IsNumeric(@OrderNumber) AND
OrderNumber LIKE ('%' + @OrderNumber))
Run Code Online (Sandbox Code Playgroud)
根据SQL的风格,您可能需要将订单号上的强制转换调整为INT或VARCHAR,具体取决于是否支持隐式强制转换.
这是WHERE子句中非常常见的技术.如果要在WHERE子句中应用一些"IF"逻辑,您需要做的就是将带有布尔AND的额外条件添加到需要应用它的部分.
Riv*_*nni 23
您根本不需要IF语句.
WHERE
(IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
Run Code Online (Sandbox Code Playgroud)
Eur*_*lli 13
在SQL中没有一种好方法可以做到这一点.我看到的一些方法:
1)使用CASE结合布尔运算符:
WHERE
OrderNumber = CASE
WHEN (IsNumeric(@OrderNumber) = 1)
THEN CONVERT(INT, @OrderNumber)
ELSE -9999 -- Some numeric value that just cannot exist in the column
END
OR
FirstName LIKE CASE
WHEN (IsNumeric(@OrderNumber) = 0)
THEN '%' + @OrderNumber
ELSE ''
END
Run Code Online (Sandbox Code Playgroud)
2)在SELECT之外使用IF
IF (IsNumeric(@OrderNumber)) = 1
BEGIN
SELECT * FROM Table
WHERE @OrderNumber = OrderNumber
END ELSE BEGIN
SELECT * FROM Table
WHERE OrderNumber LIKE '%' + @OrderNumber
END
Run Code Online (Sandbox Code Playgroud)
3)使用长字符串,有条件地编写SQL语句,然后使用EXEC
第三种方法很可怕,但如果您有许多可变条件,这几乎是唯一可行的方法.
小智 7
澄清一些逻辑等价解决方案。
if 语句
if (a) then b
Run Code Online (Sandbox Code Playgroud)
逻辑上等价于
(!a || b)
Run Code Online (Sandbox Code Playgroud)
这是逻辑等价维基百科文章中涉及条件语句的逻辑等价部分的第一行。
要包含else,您所要做的就是添加另一个条件
if(a) then b;
if(!a) then c;
Run Code Online (Sandbox Code Playgroud)
逻辑上等价于 (!a || b) && (a || c)
所以以OP为例:
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
Run Code Online (Sandbox Code Playgroud)
逻辑上的等价物是:
(IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber)
AND (IsNumeric(@OrderNumber) = 1 OR OrderNumber LIKE '%' + @OrderNumber + '%' )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
765316 次 |
最近记录: |