Проверить, если столбец имеет нулевое значение - PullRequest
2 голосов
/ 21 апреля 2009

Какой SQL будет быстрее проверять, если у определенного столбца есть нулевое значение или нет, почему?

1) ВЫБРАТЬ * ИЗ ТАБЛИЦЫ1 ГДЕ COL1 НЕДЕЙСТВИТЕЛЕН

Выполните этот запрос, а затем проверьте, можете ли вы прочитать какие-либо записи. Если да, то есть нулевые значения.

2) ВЫБЕРИТЕ COUNT (COL1) ИЗ ТАБЛИЦЫ 1, ГДЕ COL1 НЕДЕЙСТВУЕТ

Считать счетчик, который возвращается, чтобы определить, есть ли какие-либо нулевые записи

Работа с Oracle10g и SQLServer2005.

Ответы [ 4 ]

6 голосов
/ 21 апреля 2009

Счетчик (columnName) НИКОГДА не будет подсчитывать значения NULL, счетчик пропускает NULLS при указании имени столбца и учитывает NULLS при использовании *

запустите это

CREATE TABLE testnulls (ID INT)
INSERT INTO testnulls VALUES (1)
INSERT INTO testnulls VALUES (2)
INSERT INTO testnulls VALUES (null)

SELECT count(*) FROM testnulls WHERE ID IS NULL --1

SELECT count(ID) FROM testnulls WHERE ID IS NULL --0

Я бы вместо этого использовал бы существует, поскольку это логическая операция и остановится при первом появлении NULL

IF EXISTS (SELECT 1 FROM testnulls WHERE ID IS NULL)
PRINT 'YES'
ELSE
PRINT 'NO'
5 голосов
/ 21 апреля 2009

Опираясь на ответ Квинна, в Oracle это будет

SELECT COL1 FROM TABLE1 WHERE COL1 IS NULL AND ROWNUM = 1;

Таким образом, СУБД должна только прочитать одну строку, прежде чем дать вам ответ;

Однако это утверждение вводит в заблуждение. Он должен прочитать все строки, пока не найдет строку с отсутствующим значением столбца. Затем он может остановиться и вернуть этот ряд.

Если такой строки нет, будет прочитана вся таблица.

так что может быть возможно удовлетворить запрос с индексом COL1, что сделает запрос еще быстрее.

Указание только COL1 не окажет слишком большого влияния, по крайней мере, на Oracle, где индексы (обычное B-дерево) не могут использоваться для поиска значений NULL.

Вы можете в любом случае выбрать больше столбцов (например, значение первичного ключа), если вы заинтересованы в идентификации строки позже.

4 голосов
/ 21 апреля 2009

Я не знаю об Oracle, но для SQL Server этот вариант, вероятно, будет самым быстрым из всех:

SELECT TOP 1 COL1 FROM TABLE1 WHERE COL1 IS NULL;

Таким образом, СУБД должна только прочитать одну строку, прежде чем дать вам ответ; другие параметры должны читать все ненулевые строки. И я указал COL1 вместо *, поэтому можно было бы удовлетворить запрос с индексом на COL1, что сделает запрос еще быстрее.

0 голосов
/ 18 января 2018

Несколько решений (столбец содержит несколько значений NULL | Столбец - все значения NULL * Проверка одного столбца | Проверка нескольких столбцов с табличными результатами)

Если вам нужно протестировать несколько столбцов, вы можете использовать следующее:

Column_1 Column_2 Column_3
-------- -------- --------
1        2        NULL
1        NULL     NULL
5        6        NULL

Сначала , проверьте NULL и посчитайте их:

select 
    sum(case when Column_1 is null then 1 else 0 end) as Column_1, 
    sum(case when Column_2 is null then 1 else 0 end) as Column_2, 
    sum(case when Column_3 is null then 1 else 0 end) as Column_3,
from TestTable 

Возвращает число NULL:

Column_1  Column_2  Column_3
0         1         3

Если результат равен 0, значения NULL отсутствуют.

Второй , давайте посчитаем ненулевые значения:

select 
    sum(case when Column_1 is null then 0 else 1 end) as Column_1, 
    sum(case when Column_2 is null then 0 else 1 end) as Column_2, 
    sum(case when Column_3 is null then 0 else 1 end) as Column_3,
from TestTable

... Но поскольку мы здесь считаем ненулевые значения, это можно упростить до:

select 
    count(Column_1) as Column_1, 
    count(Column_2) as Column_2, 
    count(Column_3) as Column_3,
from TestTable

Любой из них дает:

Column_1  Column_2  Column_3
3         2         0

Если результат равен 0, столбец целиком состоит из NULL.

Наконец , если вам нужно только проверить определенный столбец, то TOP 1 быстрее, потому что он должен остановиться при первом попадании. Затем вы можете при желании использовать count (*) для получения результата в логическом стиле:

select count(*) from (select top 1 'There is at least one NULL' AS note from TestTable where Column_3 is NULL) a

0 = Нет NULL, 1 = Есть хотя бы один NULL

select count(*) from (select top 1 'There is at least one non-NULL' AS note from TestTable where Column_3 is not NULL) a

0 = Все они равны NULL, 1 = Существует хотя бы один ненулевой

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...