是否有可能在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 + '%'
当前回答
在sql server中,我有同样的问题,我想使用一个和语句,只有当参数为假,对真,我必须显示两个值真和假,所以我用这种方式使用它
(T.IsPublic = @ShowPublic or @ShowPublic = 1)
其他回答
您应该能够在没有任何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的额外条件。
澄清一些逻辑等价解。
if语句
if (a) then b
逻辑上等价于
(!a || b)
这是逻辑等价维基百科文章中涉及条件语句的逻辑等价部分的第一行。
要包含else,您所要做的就是添加另一个条件
if(a) then b;
if(!a) then c;
哪个在逻辑上是等价的 (!A || b) && (A || c)
以OP为例:
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
逻辑上等价的是:
(IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber)
AND (IsNumeric(@OrderNumber) = 1 OR 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
看看这是否有帮助。
CASE语句总是比IF语句更好的选择。
WHERE vfl.CreatedDate >= CASE WHEN @FromDate IS NULL THEN vfl.CreatedDate ELSE @FromDate END
AND vfl.CreatedDate<=CASE WHEN @ToDate IS NULL THEN vfl.CreatedDate ELSE @ToDate END
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END
In line case条件将正常工作。