是否有可能在mssql的WHERE子句中使用IF子句?
例子:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
是否有可能在mssql的WHERE子句中使用IF子句?
例子:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
当前回答
If @LstTransDt is Null
begin
Set @OpenQty=0
end
else
begin
Select @OpenQty=IsNull(Sum(ClosingQty),0)
From ProductAndDepotWiseMonitoring
Where Pcd=@PCd And PtpCd=@PTpCd And TransDt=@LstTransDt
end
看看这是否有帮助。
其他回答
在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
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
3)使用长字符串,有条件地编写SQL语句,然后使用EXEC
第三种方法很可怕,但如果你有许多这样的可变条件,它几乎是唯一可行的方法。
使用CASE语句而不是IF语句。
使用CASE语句 更新:之前的语法(正如一些人指出的那样)不起作用。CASE的用法如下:
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber) = 1 THEN
@OrderNumber
ELSE
'%' + @OrderNumber
END
或者你可以使用一个IF语句,比如@N。里德指出。
您应该能够在没有任何IF或CASE的情况下做到这一点
WHERE
(IsNumeric(@OrderNumber) AND
(CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR)
OR
(NOT IsNumeric(@OrderNumber) AND
OrderNumber LIKE ('%' + @OrderNumber))
根据SQL的风格,您可能需要将订单号上的类型转换调整为INT或VARCHAR,这取决于是否支持隐式类型转换。
这是WHERE子句中非常常见的技术。如果你想在WHERE子句中应用一些“If”逻辑,你所需要做的就是在需要应用它的部分中添加一个布尔AND的额外条件。
WHERE (IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber) AND (IsNumber(@OrderNumber) = 1 OR OrderNumber LIKE '%' + @OrderNumber + '%')