Cosa succede effettivamente quando esegui una query SQL che non restituisce alcuna riga? Ad esempio, pensa a una clausola WHERE con la condizione 1=2, che non può mai essere soddisfatta e quindi le righe non possono mai essere restituite.
Innanzitutto, diamo un’occhiata ad alcuni esempi che dovrebbero mostrarti cosa puoi aspettarti come valore di ritorno per diversi scenari.
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
Come hai visto nell’esempio precedente, non puoi utilizzare NVL e NVL2 perché non viene restituita alcuna riga. L’uso di NVL e NVL2 ha senso solo se vengono restituite righe in cui non tutti i valori di colonna hanno contenuto. Questo può quindi essere modificato o modificato utilizzando queste funzioni. Per il nostro problema, tuttavia, NVL e NLV2 possono essere tranquillamente esclusi qui. Maggiori informazioni sull’uso corretto e molti trucchi e suggerimenti sono disponibili nell’articolo su NVL e NVL2.
MAX/MIN in conjunction with NVL or COALESCE
Un trucco per ottenere una riga restituita è utilizzare la funzione MAX o MIN insieme a MAX o MIN. Le funzioni MAX o MIN restituiscono sempre un valore di riga, a condizione che anche questo sia NULL. Con MAX o MIN viene sempre restituita almeno una riga. Ora puoi cambiare questo valore con le funzioni NVL, NVL2 o COALESCE. Questo è un processo rapido per rispondere a query che non restituiscono alcuna riga.
Di seguito sono riportati due esempi per aiutarti a capire come funziona il concetto. Come puoi vedere, ora viene restituito almeno un valore.
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
Un’altra possibilità è la query con una clausola IF. Per fare ciò, usi la funzione EXISTS e controlli se c’è anche solo una riga che tornerebbe indietro. Il primo passaggio consiste nel verificare se esiste una riga nella query. Se questo è il caso, puoi emettere le righe. Tuttavia, se non è presente alcuna riga, è possibile emettere un’alternativa tramite il ramo ELSE e quindi visualizzare sempre una riga.
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
Un’altra possibilità è l’istruzione CASE insieme alla funzione COUNT. Come hai già visto sopra, COUNT ti dà il numero di righe restituite e può quindi darti anche il numero 0 (se non viene restituita alcuna riga). Se COUNT è un numero positivo, vengono restituiti i valori della query. Se il numero è 0, invece, dovrebbe essere selezionato il percorso alternativo, il che significa che viene restituita una riga come valore di ritorno.
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
Puoi trovare altri suggerimenti e trucchi per SQL Developer, nonché per SQL e database nella pagina della panoramica.