Restituisce un valore se non vengono trovate righe SQL

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.

Lascia un commento