IS NULL ja IS NOT NULL
Tarkistakaa puuttuvat arvot oikein.
IS NULL ja IS NOT NULL on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.
Puuttuvien arvojen tarkistaminen
Koska NULL-arvoja sisältävät vertailut palauttavat aina tuloksen unknown, SQL tarjoaa kaksi erityistä operaattoria puuttuvien arvojen tarkistamiseen: IS NULL ja IS NOT NULL.
Nämä ovat ainoat luotettavat tavat löytää NULL-arvot tai suodattaa ne pois. Tässä oppitunnissa opitte käyttämään niitä oikein.
-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;
-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;Miksi = NULL ei toimi
On houkuttelevaa kirjoittaa WHERE phone = NULL, mutta se ei koskaan täsmää mihinkään. Ehto saa jokaisella rivillä tulokseksi unknown, ja WHERE säilyttää vain rivit, joiden tulos on true.
Tuloksena on tyhjä joukko — kyseessä on huomaamaton virhe, koska virheilmoitusta ei anneta.
-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;
-- The fix
SELECT * FROM customers WHERE phone IS NULL;IS NULL käytännössä
IS NULL palauttaa arvon true täsmälleen silloin, kun arvo puuttuu, ja arvon false muulloin. Se ei koskaan palauta arvoa unknown.
Siksi sitä on turvallista käyttää kaikkialla, missä tarvitaan yksiselitteinen true/false-tulos.
SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;
-- id | name | missing_phone
-- ---+-------+--------------
-- 1 | Alice | f
-- 2 | Bob | t
-- 3 | Carol | tIS NOT NULL käytännössä
IS NOT NULL toimii täsmälleen päinvastoin: se palauttaa arvon true, kun arvo on olemassa, ja arvon false, kun se puuttuu.
Käyttäkää sitä suodattaaksenne mukaan vain rivit, joilla todella on tietoja, kuten asiakkaat, joille voitte soittaa.
SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;
-- name | phone
-- ------+----------
-- Alice | 555-0101Yhdistäminen AND- ja OR-operaattoreilla
Voitte yhdistää NULL-tarkistuksia muihin ehtoihin operaattoreilla AND ja OR.
Voitte esimerkiksi etsiä aktiiviset asiakkaat, joiden puhelinnumero puuttuu edelleen tiedoista — tämä on yleinen tietojen laadun tarkistus.
SELECT id, name
FROM customers
WHERE is_active = true
AND phone IS NULL;
-- Active customers missing a phone numberNULL NOT IN -lausekkeessa: sudenkuoppa
NOT IN toimii ongelmallisesti, jos luettelo sisältää NULL-arvon. Jos joukossa on yksikin NULL-arvo, NOT IN voi palauttaa jokaiselle riville tuloksen unknown, jolloin odottamanne tulokset jäävät pois.
Suosikaa NOT EXISTS -lauseketta tai suodattakaa NULL-arvot ensin alikyselystä.
-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);
-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);IS DISTINCT FROM
PostgreSQL tarjoaa operaattorit IS DISTINCT FROM ja IS NOT DISTINCT FROM NULL-arvojen turvalliseen vertailuun.
Toisin kuin =, ne käsittelevät kahta NULL-arvoa samoina ja NULL-arvoa suhteessa arvoon eriävänä. Ne palauttavat aina tuloksen true tai false, eivät koskaan tulosta unknown.
SELECT
NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
NULL IS DISTINCT FROM 5 AS b, -- true: NULL differs from 5
5 IS DISTINCT FROM 5 AS c; -- false: same valueKahden nullable-sarakkeen vertaaminen
Kun vertailette kahta saraketta, joiden arvot voivat olla NULL, tavallinen = ei huomioi tapausta, jossa molemmat arvot ovat NULL. IS NOT DISTINCT FROM käsittelee sen oikein.
Tämä sopii hyvin sellaisten rivien löytämiseen, jotka eivät ole muuttuneet, vaikka arvo olisi tuntematon.
-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;NULL-arvojen laskeminen
IS NULL -operaattorin käytännöllinen käyttötapa on tietojen laadun tarkistaminen — sen laskeminen, kuinka monelta riviltä arvo puuttuu.
Yhdistäkää se FILTER-lausekkeeseen (PostgreSQL) tai COUNT-funktion sisällä olevaan CASE-lausekkeeseen laskeaksenne NULL-arvot ja muut kuin NULL-arvot rinnakkain.
SELECT
count(*) AS total,
count(*) FILTER (WHERE phone IS NULL) AS missing,
count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;NULL-tarkistukset CHECK-rajoitteissa
Voitte käyttää NULL-tarkistuksia CHECK-rajoitteissa sellaisten sääntöjen toteuttamiseen kuin ”jos rivi on lähetetty, sillä on oltava lähetyspäivä”.
Huomautus: CHECK-rajoite hyväksyy rivin, kun sen ehto on true tai unknown, joten harkitkaa NULL-tapauksia tarkasti.
CREATE TABLE orders (
id integer PRIMARY KEY,
status text NOT NULL,
ship_date date,
CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);Parhaat käytännöt
Pidättehän nämä toimintatavat mielessä, jotta NULL-arvojen käsittely on turvallista:
- Tarkistakaa aina operaattoreilla
IS NULL/IS NOT NULL, älkää koskaan operaattorilla= NULL. - Varokaa
NOT IN-lauseketta, kun alikysely voi palauttaa NULL-arvoja. - Käyttäkää
IS DISTINCT FROM-operaattoria NULL-arvojen turvalliseen yhtäsuuruusvertailuun. - Tarkistakaa puuttuvat tiedot lausekkeella
count(*) FILTER (...).
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM bPikatarkistus
Haluatte kaikki asiakkaat, joiden phone-sarakkeella ei ole arvoa. Mikä WHERE-ehto on oikea?
Kertaus
Opitte oikean tavan tarkistaa puuttuvat arvot komennoilla IS NULL ja IS NOT NULL sekä sen, miksi = NULL ei koskaan toimi.
Tutustuitte myös NOT IN -sudenkuoppaan, NULL-arvot turvallisesti käsittelevään IS DISTINCT FROM -operaattoriin ja NULL-arvojen tarkistamiseen FILTER-lausekkeella. Seuraavaksi opitte korvaamaan NULL-arvot järkevillä oletusarvoilla komennoilla COALESCE ja NULLIF.
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;Opi SQL tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 46
- Oppitunnit
- 183
Usein kysytyt kysymykset
Onko oppitunti ”IS NULL ja IS NOT NULL” ilmainen?
Kyllä – oppitunnin ”IS NULL ja IS NOT NULL” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”IS NULL ja IS NOT NULL”?
Tarkistakaa puuttuvat arvot oikein. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”IS NULL ja IS NOT NULL”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?
Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Mitä NULL todella tarkoittaa
- IS NULL ja IS NOT NULL
- COALESCE ja NULLIF
- NULL-arvot koostefunktioissa ja liitoksissa