SQL:WHERE子句中的IF子句
MS SQL中的WHERE子句中可以使用IF子句吗?
例:
WHERE IF IsNumeric(@OrderNumber) = 1 OrderNumber = @OrderNumber ELSE OrderNumber LIKE '%' + @OrderNumber + '%'
使用CASE语句
更新:以前的语法(如less数人指出)不起作用。 您可以使用CASE如下:
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END
或者你可以使用像@JReed指出的IF语句。
你应该可以做到这一点,没有任何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加到需要应用的部分。
在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)使用一个长string,有条件地编写你的SQL语句,然后使用EXEC
第三种方法是可怕的,但它是几乎唯一的想法,如果你有这样的变数条件。
你根本不需要IF语句。
WHERE (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber) OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
使用CASE语句而不是IF。
你想要CASE语句
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
我认为在哪里…就像/ = …案例…然后…可以和布尔人一起工作。 我正在使用T-SQL。
场景:比方说,如果bool是假的,你想得到Person-30的爱好,而如果bool是真的,Person-42的爱好。 (有些人认为,业务计算周期占业务计算周期的90%以上,因此付出的代价很高)。
CREATE PROCEDURE sp_Case @bool bit AS SELECT Person.Hobbies FROM Person WHERE Person.ID = case @bool when 0 then 30 when 1 then 42 end;
WHERE(IsNumeric(@OrderNumber)<> 1或OrderNumber = @OrderNumber) AND(IsNumber(@OrderNumber)= 1或OrderNumber LIKE'%' + @订单号+'%')
以下示例将执行查询作为布尔expression式的一部分,然后根据布尔expression式的结果执行略有不同的语句块。 每个语句块以BEGIN开始并以END结束。
USE AdventureWorks2012; GO DECLARE @AvgWeight decimal(8,2), @BikeCount int IF (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5 BEGIN SET @BikeCount = (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%'); SET @AvgWeight = (SELECT AVG(Weight) FROM Production.Product WHERE Name LIKE 'Touring-3000%'); PRINT 'There are ' + CAST(@BikeCount AS varchar(3)) + ' Touring-3000 bikes.' PRINT 'The average weight of the top 5 Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.'; END ELSE BEGIN SET @AvgWeight = (SELECT AVG(Weight) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ); PRINT 'Average weight of the Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.' ; END ; GO
使用嵌套的IF … ELSE语句以下示例显示了如何将IF … ELSE语句嵌套在另一个中。 将@Numbervariables设置为5,50和500以testing每个语句。
DECLARE @Number int SET @Number = 50 IF @Number > 100 PRINT 'The number is large.' ELSE BEGIN IF @Number < 10 PRINT 'The number is small' ELSE PRINT 'The number is medium' END ; GO
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
看看这是否有帮助。
USE AdventureWorks2012; GO IF (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5 PRINT 'There are more than 5 Touring-3000 bicycles.' ELSE PRINT 'There are 5 or less Touring-3000 bicycles.' ; GO
- MySQL错误1093 – 无法在FROM子句中为更新指定目标表
- 如何创build一个SQL Server函数来将多个行从一个子查询连接到单个分隔的字段?
- SQL – IF EXISTS UPDATE ELSE INSERT INTO
- 如何让查询生成器将其原始SQL查询作为string输出?
- 文本,ntext和图像数据>types不能进行比较或sorting,除非使用IS NULL或LIKE>运算符
- 如何在SQL Server数据库中的任何地方find值?
- PostgreSQL与MySQL有何不同?
- 如何访问Java程序中SQL count()查询的值
- 在存储过程参数列表中使用expression式的结果(例如函数调用)?