Wat gebeurt er eigenlijk als u een SQL-query uitvoert die geen rijen retourneert? Denk bijvoorbeeld aan een WHERE-clausule met de voorwaarde 1=2, waaraan nooit kan worden voldaan en daarom kunnen rijen nooit worden geretourneerd.
Laten we eerst een paar voorbeelden bekijken die u laten zien wat u kunt verwachten als retourwaarde voor verschillende scenario’s.
SELECT *
FROM DUAL
WHERE 1=1
-- Return: X
SELECT *
FROM DUAL
WHERE 1=2
-- Return: - (nicht NULL!)
SELECT NVL(DUMMY,1)
FROM DUAL
WHERE 1=2
-- Return: - (nicht NULL!)
SELECT COUNT(*)
FROM DUAL
WHERE 1=2
-- Return: 0
SELECT MAX(dummy)
FROM DUAL
WHERE 1=2
-- Return: NULL
NVL and NVL2
Zoals je in het bovenstaande voorbeeld hebt gezien, kun je NVL en NVL2 niet gebruiken omdat er geen rijen worden geretourneerd. Het gebruik van NVL en NVL2 heeft alleen zin als er rijen worden geretourneerd waarin niet elke kolomwaarde inhoud heeft. Dit kan vervolgens met behulp van deze functies worden aangepast of veranderd. Voor ons probleem kunnen NVL en NLV2 hier echter veilig worden uitgesloten. Meer informatie over het juiste gebruik en vele trucs en tips vind je in het artikel over NVL en NVL2.
MAX/MIN in conjunction with NVL or COALESCE
Een truc om een rij als resultaat te krijgen, is door de functie MAX of MIN te gebruiken in combinatie met MAX of MIN. De MAX- of MIN-functies retourneren altijd een rijwaarde, op voorwaarde dat deze ook NULL is. Bij MAX of MIN wordt altijd minimaal één regel geretourneerd. Nu kunt u deze waarde wijzigen met de functies NVL, NVL2 of COALESCE. Dit is een snel proces om te reageren op vragen die geen rijen zouden retourneren.
Hieronder staan twee voorbeelden om u te helpen begrijpen hoe het concept werkt. Zoals u kunt zien, wordt nu ten minste één waarde geretourneerd.
SELECT NVL(MAX(dummy), 'Z')
FROM DUAL
WHERE 1=2
-- Return: Z
SELECT COALESCE(MAX(dummy), 'Z')
FROM DUAL
WHERE 1=2
-- Return: Z
CASE and EXISTS
Een andere mogelijkheid is de query met een IF-clausule. Om dit te doen, gebruik je de EXISTS-functie en controleer je of er zelfs een regel is die terug zou komen. De eerste stap is om te controleren of er een rij in uw zoekopdracht voorkomt. Als dit het geval is, kunt u de regels uitvoeren. Als er echter geen regel is, kunt u een alternatief uitvoeren via de ELSE-tak en krijgt u dus altijd een regel weergegeven.
SELECT CASE
WHEN EXISTS
(SELECT 1
FROM DUAL
WHERE 1=2)
THEN
(SELECT *
FROM DUAL
WHERE 1=2)
ELSE 'Z'
END
FROM DUAL
-- Return: Z
CASE and COUNT
Een andere mogelijkheid is de CASE-instructie in combinatie met de COUNT-functie. Zoals je hierboven al hebt gezien, geeft COUNT je het aantal geretourneerde rijen en kan je dus zelfs het getal 0 geven (als er geen rij wordt geretourneerd). Als COUNT een positief getal is, worden de waarden van de query geretourneerd. Als het getal daarentegen 0 is, moet het alternatieve pad worden geselecteerd, wat betekent dat één regel als retourwaarde wordt geretourneerd.
SELECT CASE
WHEN
(SELECT COUNT(*)
FROM DUAL
WHERE 1=2) <> 0
THEN
(SELECT *
FROM DUAL
WHERE 1=2)
ELSE 'Z'
END
FROM DUAL
-- Return: Z
Meer tips en trucs voor SQL Developer, maar ook voor SQL en databases vind je op de overzichtspagina.