在SQL(SQL Server 2005)中是否存在等效于VB的AndAlso
/ OrElse
和C#的&&
/ ||
。我正在运行类似于以下内容的选择查询:
SELECT a,b,c,d
FROM table1
WHERE
(@a IS NULL OR a = @a)
AND (@b IS NULL OR b = @b)
AND (@c IS NULL OR c = @c)
AND (@d IS NULL OR d = @d)
例如,如果将“@a”参数作为NULL传入,则无法评估WHERE子句的第二部分(a = @a)。有没有办法通过使用特殊语法或重写查询来避免这种情况?
谢谢, 詹姆斯。
答案 0 :(得分:5)
保证评估顺序的唯一方法是使用CASE
WHERE
CASE
WHEN @a IS NULL THEN 1
WHEN a = @a THEN 1
ELSE 0
END = 1
AND /*repeat*/
根据我的经验,这通常比让DB引擎排序更慢。
TerrorAustralis的答案通常是非可空列的最佳选择
答案 1 :(得分:3)
试试这个:
AND a = ISNULL(@a,a)
此功能查看@a。如果它不为null,则等同于表达式
AND a = @a
如果为null,则等同于表达式
AND a = a
(因为这总是如此,它取代了@b是null语句)
答案 2 :(得分:1)
查询引擎会为您处理此问题。你写的查询很好。如果可以的话,所有操作员都会“短路”。
答案 3 :(得分:0)
另一种方法是:
IF (@a > 0) IF (@a = 5)
BEGIN
END
另一个如果在条件之后会做一个" AndAlso"逻辑。
我想要说明这只是一个简短的写作方式:
IF (@a > 0)
IF (@a = 5)
BEGIN
END
答案 4 :(得分:0)
举个例子:
SELECT * FROM Orders
WHERE orderId LIKE '%[0-9]%'
AND dbo.JobIsPending(OrderId) = 1
Orders.OrderId
是varchar(25)
dbo.JobIsPending(OrderId)
UDF
由于转换在dbo.JobIsPending(OrderId) when
Orders.OrderId NOT LIKE '%[0-9]%'
在SQL Server 2008 R2上测试