我正在编写一个参数化查询,其中要求LIKE
子句在NULL
时包含field LIKE '%'
值。
我有多种解决方案;我并排运行这些查询,他们使用相同的摘要返回类似的执行计划,查询时间也相似。我担心这些查询如何扩展具有数百万条记录的表的性能。
-- Where @PartId is typically '%' or could be 'Part123%'.
SELECT *
FROM dbo.OrderItems AS oi
WHERE oi.PartId IS NULL OR oi.PartId LIKE @PartId
SELECT *
FROM dbo.OrderItems AS oi
WHERE ISNULL(oi.PartId, '') LIKE @PartId
SELECT *
FROM dbo.OrderItems AS oi
WHERE COALESCE(oi.PartId, '') LIKE @PartId
这个question表明ISNULL
和COALESCE
之间几乎没有什么区别。 Grant Fritchey在这个article中演示了在WHERE
子句中应用函数会导致比使用LIKE
更大的性能障碍,但是我已经读过使用逻辑OR
会导致查询中出现性能问题。使用IS NULL OR
与ISNULL
替代品的性能影响是什么?
您没有粘贴所选择的计划,但我只能假设它涉及表扫描?
有时候值得重写SQL来使用联合查询,而不是使用“WHERE CONDITION1 OR CONDITION2”:
SELECT *
FROM dbo.Customers AS c
WHERE c.Name IS NULL
UNION ALL
SELECT *
FROM dbo.Customers AS c
WHERE c.Name = @CustomerName
这可以防止表扫描。
不太确定你的查询逻辑。你的where子句
oi.PartId IS NULL OR oi.PartId LIKE '%'
和其他两个where子句只是字面意思是“选择我在PartID为null或PartID为非null的记录”。
由于PartID只能为NULL或不为null,为什么首先需要where子句?
你测试过吗?仅对like '%'
进行测试是有缺陷的结果。如果用like
替换=
,它仍然存在缺陷。
这些查询返回不同的结果!
declare @match varchar(10) = '%match%';
declare @val varchar(10) = null;
select 'yes'
where @val is null or @val like @match;
select 'yes'
where isnull(@val, '') like @match;