嗯,问题很清楚。这是第一个查询:
SELECT
o.Col1,
o.Col2
FROM
[Orders] o
WHERE
ISNULL(@CustomerId, o.CustomerId) = o.CustomerId
这是另一个:
SELECT
o.Col1,
o.Col2
FROM
[Orders] o
WHERE
CASE
WHEN @CustomerId IS NULL THEN 1
ELSE IIF(@CustomerId = o.CustomerId, 1, 0)
END = 1
谢谢。
答案 0 :(得分:2)
更好的写作方式是:
SELECT
o.Col1,
o.Col2
FROM
[Orders] o
WHERE
@CustomerId IS NULL OR @CustomerId = o.CustomerId
如果@CustomerId
为空,至少查询优化器可以提前看到,并相应地选择一个计划。
答案 1 :(得分:0)
如果您关心性能,那么您可以使用动态SQL或类似的查询:
SELECT o.Col1, o.Col2
FROM Orders o
WHERE @CustomerId is null
UNION ALL
SELECT o.Col1, o.Col2
FROM Orders o
WHERE o.CustomerId = @CustomerId;
第一个子查询不会使用索引,但应检测是否没有返回任何值。第二个只在客户ID匹配时返回一个值,并且可以使用索引。
ISNULL(@CustomerId, o.CustomerId) = o.CustomerId