Non è null e isnull (str, null) nella clausola dove
-
30-10-2019 - |
Domanda
Ho tre tabelle (semplificate qui):
recipients: recipientId, isGroup
users: userId, first name, last name
groups: groupid, groupname
Voglio ritirare il nome / cognome se il destinatario è un utente e il nome del gruppo se il destinatario è un gruppo. È possibile che il destinatario non sia nessuno dei due (cioè un gruppo che è stato cancellato/non più esiste), quindi in quel caso non voglio restituire nulla.
Quindi questo è quello che ho fatto:
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
La query di cui sopra non sta restituendo i risultati previsti. Lo sto riprendendo:
adam, smith, null, null
yolanda, smith, null, null
null, null, members, 1
null, null, null, 1
L'ultima riga è inaspettata, poiché chiaramente non esiste un nome di gruppo (G.GroupName è nullo) e r.isGroup = 1.
Quando lo faccio:
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
Ottengo i risultati previsti:
adam, smith, null, null
yolanda, smith, null, null
E quando lo faccio:
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
Ottengo i risultati previsti:
null, null, members, 1
È solo quando combino i due in cui le clausole con un o, ottengo la riga aggiuntiva.
Ora, quando cambio la mia domanda in (cambio da null a 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
Ottengo i risultati previsti:
adam, smith, null, null
yolanda, smith, null, null
null, null, members, 1
In effetti, non devo nemmeno cambiare la clausola Where, anche la seguente query funziona altrettanto bene e mi dà il risultato atteso mostrato sopra:
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
Quindi, la domanda è: perché? Perché mettere ISNULL nella mia istruzione selezionata cambia come funziona la clausola Where? Perché fa la differenza? Perché la mia prima query non funziona? Perché non riesce a funzionare solo quando aggiungo o - perché non è rotto senza di essa?
Grazie in anticipo.
Sto usando MS SQL Server 2008.
Modifiche: errori di battitura fissi, domanda chiarificata
Nessuna soluzione corretta