我正在尝试执行以下操作:
IF NOT EXISTS (
SELECT *
FROM [tbl_web_company]
WHERE [name] = @name
AND [address1] = @address1
AND [address2] = @address2
AND [city] = @city
AND [province_id] = @province_id
AND [postal_code] = @postalcode
AND [contact_phone] = @phone
AND [contact_fax] = @fax
AND [deleted] = dbo.pvd_fn_getDeletedDate(@id, @active))
BEGIN
SELECT 'update'
END
ELSE
BEGIN
SELECT 'no update'
END
我基本上试图查看是否有任何列发生了变化,但是当@province_id和dbo.pvd_fn_getDeletedDate(@ id,@ active)在数据库中为NULL时,我遇到了问题,并且都设置为NULL 。
省ID是INT - Nullable
已删除是Datetime - Nullable。
如果数据库中的记录对这两个值都为NULL,那么这将始终选择“更新”。这是错误的,因为[province_id]和[deleted]是NULL。
在这种情况下如何处理NULLS的任何建议?
答案 0 :(得分:4)
您可以使用ISNULL()函数设置默认值吗?
SELECT *
FROM [tbl_web_company]
WHERE [name] = @name
AND [address1] = @address1
AND [address2] = @address2
AND [city] = @city
AND ISNULL([province_id],99999) = ISNULL(@province_id,99999)
AND [postal_code] = @postalcode
AND [contact_phone] = @phone
AND [contact_fax] = @fax
AND ISNULL([deleted], '1990-01-01') = ISNULL(dbo.pvd_fn_getDeletedDate(@id, @active), '1990-01-01')
BEGIN
SELECT 'update'
END
ELSE
BEGIN
SELECT 'no update'
END
使用ISNULL()可以防止优化器使用索引,所以通常我会建议不要这样做,但是这个查询的写法,如果它正在使用索引,我会感到惊讶。
答案 1 :(得分:3)
使用 一片空白 代替 = NULL
答案 2 :(得分:2)
改为使用“IS NULL”:
SELECT 'Is null' WHERE NULL = NULL
没有返回任何行,但是:
SELECT 'Is null' WHERE NULL IS NULL
将...
关于空值here
的好读物答案 3 :(得分:2)
由于您的值来自参数且未经过硬编码,因此您可以使用以下内容:
...
AND ([province_id] IS NULL OR [province_id] = @province_id)
...
对其他NULLABLE
字段使用相同的结构。