Oracle Database
Обработка значений NULL
Поиск…
Вступление
Столбец имеет значение NULL, если он не имеет значения, независимо от типа данных этого столбца. Столбец никогда не должен сравниваться с NULL, используя этот синтаксис
a = NULL
как результат будет UNKNOWN. Вместо этого используйте условия a IS NULL
или a IS NOT NULL
. NULL не равен NULL. Чтобы сравнить два выражения, где может быть null, используйте одну из функций, описанных ниже. Все операторы, кроме конкатенации, возвращают NULL, если один из их операндов равен NULL. Например, результат 3 * NULL + 5
равен null.
замечания
NULL не может отображаться в столбцах, ограниченных ограничением PRIMARY KEY или NOT NULL. (Исключение - новое ограничение с предложением NOVALIDATE)
Столбцы любого типа данных могут содержать NULL
SELECT 1 NUM_COLUMN, 'foo' VARCHAR2_COLUMN from DUAL
UNION ALL
SELECT NULL, NULL from DUAL;
NUM_COLUMN | VARCHAR2_COLUMN |
---|---|
1 | Foo |
(ноль) | (ноль) |
Пустые строки: NULL
SELECT 1 a, '' b from DUAL;
В | |
---|---|
1 | (ноль) |
Операции, содержащие NULL, являются NULL, за исключением конкатенации
SELECT 3 * NULL + 5, 'Hello ' || NULL || 'world' from DUAL;
3 * NULL + 5 | 'ПРИВЕТ' || NULL || 'МИР' |
---|---|
(ноль) | Привет, мир |
NVL заменит нулевое значение
SELECT a column_with_null, NVL(a, 'N/A') column_without_null FROM
(SELECT NULL a FROM DUAL);
COLUMN_WITH_NULL | COLUMN_WITHOUT_NULL |
---|---|
(ноль) | N / A |
NVL полезно сравнить два значения, которые могут содержать 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 получить другой результат, если значение равно null или нет
Если первый параметр NOT NULL, NVL2 вернет второй параметр. В противном случае он вернет третий.
SELECT NVL2(null, 'Foo', 'Bar'), NVL2(5, 'Foo', 'Bar') FROM DUAL;
NVL2 (NULL, 'Foo', 'BAR') | NVL2 (5, 'Foo', 'BAR') |
---|---|
Бар | Foo |
COALESCE, чтобы вернуть первое значение, отличное от NULL
SELECT COALESCE(a, b, c, d, 5) FROM
(SELECT NULL A, NULL b, NULL c, 4 d FROM DUAL);
СОАЬЕЗСЕ (А, В, С, D, 5) |
---|
4 |
В некоторых случаях использование COALESCE с двумя параметрами может быть быстрее, чем использование NVL, когда второй параметр не является константой. NVL всегда будет оценивать оба параметра. COALESCE остановится при первом не-NULL-значении, с которым он сталкивается. Это означает, что если первое значение не является NULL, COALESCE будет быстрее.
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow