Oracle Database
Hantering av NULL-värden
Sök…
Introduktion
En kolumn är NULL när den inte har något värde, oavsett datatyp för den kolumnen. En kolumn ska aldrig jämföras med NULL med användning av denna syntax
a = NULL
eftersom resultatet skulle bli Okänt. Använd istället a IS NULL
eller a IS NOT NULL
villkor. NULL är inte lika med NULL. För att jämföra två uttryck där noll kan hända, använd en av funktionerna som beskrivs nedan. Alla operatörer utom sammankoppling returnerar NULL om en av deras operander är NULL. Till exempel är resultatet av 3 * NULL + 5
noll.
Anmärkningar
NULL kan inte visas i kolumner begränsade av en PRIMÄRKNYGL eller en INTE NULL-begränsning. (Undantag är en ny begränsning med NOVALIDATE-klausulen)
Kolumner av vilken datatyp som helst kan innehålla NULL: er
SELECT 1 NUM_COLUMN, 'foo' VARCHAR2_COLUMN from DUAL
UNION ALL
SELECT NULL, NULL from DUAL;
NUM_COLUMN | VARCHAR2_COLUMN |
---|---|
1 | foo |
(null) | (null) |
Tomma strängar är NULL
SELECT 1 a, '' b from DUAL;
EN | B |
---|---|
1 | (null) |
Operationer som innehåller NULL är NULL, förutom sammanlänkning
SELECT 3 * NULL + 5, 'Hello ' || NULL || 'world' from DUAL;
3 * NULL + 5 | 'HEJ' || NOLL || 'värld' |
---|---|
(null) | Hej världen |
NVL för att ersätta nullvärdet
SELECT a column_with_null, NVL(a, 'N/A') column_without_null FROM
(SELECT NULL a FROM DUAL);
COLUMN_WITH_NULL | COLUMN_WITHOUT_NULL |
---|---|
(null) | N / A |
NVL är användbart för att jämföra två värden som kan innehålla 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 för att få ett annat resultat om ett värde är noll eller inte
Om den första parametern INTE är NULL kommer NVL2 att returnera den andra parametern. Annars kommer den att returnera den tredje.
SELECT NVL2(null, 'Foo', 'Bar'), NVL2(5, 'Foo', 'Bar') FROM DUAL;
NVL2 (NULL, 'FOO', 'bar') | NVL2 (5, 'FOO', 'BAR') |
---|---|
Bar | foo |
COALESCE för att returnera det första värdet som inte är 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 |
I vissa fall kan COALESCE med två parametrar vara snabbare än att använda NVL när den andra parametern inte är en konstant. NVL kommer alltid att utvärdera båda parametrarna. COALESCE kommer att stanna vid det första värdet utan NULL som det möter. Det betyder att om det första värdet är icke-NULL, kommer COALESCE att vara snabbare.
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow