检查变量是否具有值或WH NULL子句的IS NULL - 性能问题

时间:2016-02-14 11:13:09

标签: sql sql-server tsql parameters

有几种方法可以检查参数是否为空或具有值。 检查的最好方法之一如下:

DECLARE @PhoneNo VARCHAR(12) = '12345'

SELECT *
FROM PhoneNumber
WHERE 
    PhoneNo = @PhoneNo OR @PhoneNo IS NULL

问题是,当我使用OR运算符时需要5秒或更长时间。但是,如果我只是写

PhoneNo = @PhoneNo

只需不到一秒钟。

最终解决方案可以使用动态查询。我不喜欢那样做。

2 个答案:

答案 0 :(得分:0)

如果传入的变量为NULL,您希望实现什么?很明显,返回所有行可能需要比返回一个拟合行更长的时间。

如果您不想在这个地方接受NULL,请改变您的逻辑:

DECLARE @PhoneNo VARCHAR(12)

SELECT *
FROM PhoneNumber
WHERE 
    @PhoneNo IS NOT NULL AND PhoneNo = @PhoneNo

答案 1 :(得分:-1)

选项1

您可以使用coalesce()函数。

即合并(PhoneNo,@ PhoneNo)= @PhoneNo。

如果变量为null,这将用数据替换数据库中的PhoneNo。

选项2

使用联合查询,因为这比使用“OR”子句更快。

示例:

SELECT * FROM PhoneNumber WHERE PhoneNo = @PhoneNo
UNION ALL
SELECT * FROM PhoneNumber WHERE @PhoneNo IS NULL