Zodra ik met Informix (IDS V7.31.UC6A) een OR in mijn WHERE sectie opneem waarbij ik voorwaarden stel aan een tabel die er met een outer join aangehangen is gebeuren er vreemde zaken rond NULL's.
Een voorbeeld zegt meer dan duizend woorden:
Structuur database:
tabel1:
volg_nr
pers_nr
tabel2:
pers_nr
naam
Voorbeeld database
tabel1:
[(1,1),(2,NULL),(3,2)]
tabel2:
[(1,"Jan"),(2,"Piet")]
Voorbeelden:
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
# alle (logische) combinaties
Uitkomst
[(1,1,"Jan"),(2,NULL,NULL),(3,2,"Piet)]
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
AND (tabel1.persnr IS NOT NULL)
# alle combinaties met een naam
Uitkomst
[(1,1,"Jan"),(3,2,"Piet)]
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
AND (tabel1.pers_nr IS NOT NULL)
AND (tabel2.naam = "Jan")
# iedereen die Jan heet
Uitkomst
[(1,1,"Jan"),(3,2,NULL)]
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
AND
(1=2
OR
(
(tabel1.pers_nr IS NOT NULL)
)
)
# (alle combinaties waarvoor geldt 1=2) + (alle combinaties met een naam)
Uitkomst
[(1,1,"Jan"),(3,2,"Piet)]
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
AND
(1=2
OR
(
(tabel1.pers_nr IS NOT NULL)
AND
(tabel2.naam = "Jan")
)
)
# (alle combinaties waarvoor geld 1=2) + (alle combinaties met een naam die Jan is)
Uitkomst
[(1,1,"Jan"),(2,NULL,NULL),(3,2,NULL)]
Waarom komen de laatste twee entries mee?! Wie het weet mag het zeggen
[edit1]Twee and's toegevoegd die ik vergeten was bij de omzetting naar pseudo code[/edit2]
[edit1]Uitkomst een van de voorbeelden aangepast naar de realiteit[/edit2]
Een voorbeeld zegt meer dan duizend woorden:
Structuur database:
tabel1:
volg_nr
pers_nr
tabel2:
pers_nr
naam
Voorbeeld database
tabel1:
[(1,1),(2,NULL),(3,2)]
tabel2:
[(1,"Jan"),(2,"Piet")]
Voorbeelden:
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
# alle (logische) combinaties
Uitkomst
[(1,1,"Jan"),(2,NULL,NULL),(3,2,"Piet)]
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
AND (tabel1.persnr IS NOT NULL)
# alle combinaties met een naam
Uitkomst
[(1,1,"Jan"),(3,2,"Piet)]
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
AND (tabel1.pers_nr IS NOT NULL)
AND (tabel2.naam = "Jan")
# iedereen die Jan heet
Uitkomst
[(1,1,"Jan"),(3,2,NULL)]
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
AND
(1=2
OR
(
(tabel1.pers_nr IS NOT NULL)
)
)
# (alle combinaties waarvoor geldt 1=2) + (alle combinaties met een naam)
Uitkomst
[(1,1,"Jan"),(3,2,"Piet)]
Query
SELECT tabel1.volg_nr, tabel1.pers_nr, tabel2.naam
FROM tabel1, OUTER tabel2
WHERE tabel1.pers_nr = tabel2.pers_nr
AND
(1=2
OR
(
(tabel1.pers_nr IS NOT NULL)
AND
(tabel2.naam = "Jan")
)
)
# (alle combinaties waarvoor geld 1=2) + (alle combinaties met een naam die Jan is)
Uitkomst
[(1,1,"Jan"),(2,NULL,NULL),(3,2,NULL)]
Waarom komen de laatste twee entries mee?! Wie het weet mag het zeggen
[edit1]Twee and's toegevoegd die ik vergeten was bij de omzetting naar pseudo code[/edit2]
[edit1]Uitkomst een van de voorbeelden aangepast naar de realiteit[/edit2]
Rekeningrijden is onvermijdelijk, uitstel is struisvogelpolitiek.