我有三個表(這裏簡化)NULL和ISNULL(STR,NULL):是不是在WHERE子句
recipients: recipientId, isGroup
users: userId, first name, last name
groups: groupid, groupname
我想中檢索第一個名稱/姓名,如果收款人是一個用戶,如果收件人是一個組,則爲組名。接收者可能不是(即一個被刪除/不再存在的組),所以在這種情況下我不想返回任何東西。
所以這是我做過什麼:
select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL or g.groupname IS NOT NULL
上面的查詢沒有返回預期的結果。我得到這個回:
adam, smith, null, null
yolanda, smith, null, null
null, null, members, 1
null, null, null, 1
最後一行是意想不到的,因爲很明顯,沒有組名(g.groupname是NULL)和r.IsGroup = 1
當我這樣做:
select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL
我得到預期的結果:
adam, smith, null, null
yolanda, smith, null, null
當我這樣做:
select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where g.groupname IS NOT NULL
我得到預期的結果:
null, null, members, 1
只有當我與OR結合兩個where子句,我會得到更多的排。
現在,當我改變我的查詢到(其他城市從IS NULL到ISNULL):
select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL or ISNULL(g.groupname, null) IS NOT NULL
我得到預期的結果:
adam, smith, null, null
yolanda, smith, null, null
null, null, members, 1
事實上,我甚至不有要改變where子句,下面的查詢也同樣適用,並給出了上面顯示的預期結果:
select u.first_name, u.last_name, ISNULL(g.groupname,null), r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL or g.groupname IS NOT NULL
S O,問題是,爲什麼? 爲什麼在我的SELECT語句中放置ISNULL會改變WHERE子句的工作方式?爲什麼它有所作爲? 爲什麼我的第一個查詢不起作用?爲什麼只有當我添加OR時它纔會發揮作用 - 爲什麼它沒有被破壞呢?
在此先感謝。
我使用MS SQL Server 2008的
編輯:固定錯字,澄清問題
您能否確保g.groupname包含NULL值而不是像「NULL」這樣的字符串。有時候可能會讓你困惑。 –
是的。我確實確定。除此之外,如果沒有,ISNULL(g.groupname,null)IS NOT NULL不會有任何區別。 – Swati