Oracle Database
Gestire valori NULL
Ricerca…
introduzione
Una colonna è NULL quando non ha alcun valore, indipendentemente dal tipo di dati di quella colonna. Una colonna non dovrebbe mai essere paragonata a NULL usando questa sintassi
a = NULL
quanto il risultato sarebbe UNKNOWN. Usa invece a IS NULL
o a IS NOT NULL
. NULL non è uguale a NULL. Per confrontare due espressioni in cui può verificarsi null, utilizzare una delle funzioni descritte di seguito. Tutti gli operatori tranne la concatenazione restituiscono NULL se uno dei loro operandi è NULL. Ad esempio il risultato di 3 * NULL + 5
è nullo.
Osservazioni
NULL non può apparire in colonne limitate da una PRIMARY KEY o da un vincolo NOT NULL. (L'eccezione è un nuovo vincolo con la clausola NOVALIDATE)
Le colonne di qualsiasi tipo di dati possono contenere valori NULL
SELECT 1 NUM_COLUMN, 'foo' VARCHAR2_COLUMN from DUAL
UNION ALL
SELECT NULL, NULL from DUAL;
NUM_COLUMN | VARCHAR2_COLUMN |
---|---|
1 | foo |
(nullo) | (nullo) |
Le stringhe vuote sono NULL
SELECT 1 a, '' b from DUAL;
UN | B |
---|---|
1 | (nullo) |
Le operazioni che contengono NULL sono NULL, tranne la concatenazione
SELECT 3 * NULL + 5, 'Hello ' || NULL || 'world' from DUAL;
3 * NULL + 5 | 'CIAO' || NULL || 'Mondo' |
---|---|
(nullo) | Ciao mondo |
NVL per sostituire il valore nullo
SELECT a column_with_null, NVL(a, 'N/A') column_without_null FROM
(SELECT NULL a FROM DUAL);
COLUMN_WITH_NULL | COLUMN_WITHOUT_NULL |
---|---|
(nullo) | N / A |
NVL è utile per confrontare due valori che possono contenere valori NULL:
SELECT
CASE WHEN a = b THEN 1 WHEN a <> b THEN 0 else -1 END comparison_without_nvl,
CASE WHEN NVL(a, -1) = NVL(b, -1) THEN 1 WHEN NVL(a, -1) <> NVL(b, -1) THEN 0 else -1 END comparison_with_nvl
FROM
(select null a, 3 b FROM DUAL
UNION ALL
SELECT NULL, NULL FROM DUAL);
COMPARISON_WITHOUT_NVL | COMPARISON_WITH_NVL |
---|---|
-1 | 0 |
-1 | 1 |
NVL2 per ottenere un risultato diverso se un valore è nullo o no
Se il primo parametro NON è NULL, NVL2 restituirà il secondo parametro. Altrimenti restituirà il terzo.
SELECT NVL2(null, 'Foo', 'Bar'), NVL2(5, 'Foo', 'Bar') FROM DUAL;
NVL2 (NULL, 'FOO', 'bar') | NVL2 (5, 'FOO', 'bar') |
---|---|
Bar | foo |
COALESCE per restituire il primo valore non NULL
SELECT COALESCE(a, b, c, d, 5) FROM
(SELECT NULL A, NULL b, NULL c, 4 d FROM DUAL);
COALESCE (A, B, C, D, 5) |
---|
4 |
In alcuni casi, l'utilizzo di COALESCE con due parametri può essere più rapido rispetto all'utilizzo di NVL quando il secondo parametro non è una costante. NVL valuterà sempre entrambi i parametri. COALESCE si fermerà al primo valore non NULL che incontra. Significa che se il primo valore non è NULL, COALESCE sarà più veloce.
Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow