2016-09-01 5 views
2

Посмотрите мой пример, какая разница между двумя кодами?В чем разница между ними не null и <> ''

Select name from customers where name is not null 

Select name from customers where name <> '' 
+3

Первые проверки для null и второго для пустой строки –

+2

Я тестирую его, а второй пример проверяет на непустую строку и для NULL – DiH

+0

Просьба поделиться тем, что вы протестировали (примеры данных + фактические результаты по сравнению с ожидаемыми результатами). Я предполагаю, что вы не правильно интерпретируете свой тест, но мы не можем сказать, не делитесь ли вы тем, что вы сделали и с какими данными. – sstan

ответ

4

Они делают совершенно разные вещи.

Select name from customers where name is not null 

Этот человек выбирает любого клиента, у которого есть значение в поле имени. Эти ценности могут включать в себя «как», так и «Сэм», «Джон Джонс», «Красивая блондинка».

Select name from customers where name <> '' 

Это выберет все имена, которые не являются пустыми или пустыми. На сервере Sql по крайней мере. Другие базы данных могут обрабатывать это по-разному. Причина, по которой он также исключает Null, заключается в том, что Null не может быть частью сравнения, поскольку по определению означает, что мы не знаем, что такое значение этого поля.

Если вы хотите вернуть как настоящие имена, так и нулевые значения и исключите только пустые строки. В SQL Server вы могли бы сделать:

Select name from customers where coalesce(name, 'Unknown') <>'' 
0

Нулевая и пустая строка - это две разные вещи. Данное поле в таблице может иметь либо значение (null), либо значение пустой строки (''). Результаты, возвращаемые каждым запросом, будут взаимоисключающими.

+0

Да, но когда я использую <> '', он обрабатывает пустые строки и значения NULL – DiH

+0

В MySQL, DB2, SQL Server, Oracle или что-то еще? – woz

+0

@woz это Oracle, я полагаю –

0

Is not null определяет, является ли проверяемый объект/запись истинным нулевым значением или нет (нет данных).

<> '' означает, что это не пустая строка, поэтому запись содержит данные (есть пустая строка) и фактически не является нулевым.

Таким образом, запрос с не null будет возвращать записи со значением string.empty, а запрос с <> '' будет возвращать значения, которые являются нулевыми. Чтобы поймать как пустые строки, так и нулевые значения, вы должны использовать оба условия в своих операторах SQL.

+4

"* запрос с <> '' возвращает значения, которые являются нулевыми *" - нет, это не будет. –

1

Есть много правильных ответов здесь, но я думаю, что вам не хватает, что NULL является. Ничего не значит, что это ничего не сравнимо. Вот некоторые тест для вас

DECLARE @param CHAR(1)=NULL --you can replace @param with your column name in your queries 

SELECT 1 WHERE @param = NULL --you can't compare NULL to anything using = > < <> != or any other comparision operator 
SELECT 1 WHERE @param = ''  --an empty value isn't the same as a NULL value so if a NULL is present it won't be returned 
SELECT 1 where @param IS NULL --this is how you have to check for null values 

--If you want to check for both empty and nulls, you can force the empty string with COALESCE or ISNULL 

SELECT 1 WHERE COALESCE(@param,'') = '' 
SELECT 1 WHERE ISNULL(@param,'') = '' 
1

Ключевым понятием вам не хватает в том, что в SQL Server, NULL не значит, никакого значения, это означает, что значение неизвестно. Поэтому рассмотрит ваш запрос с некоторыми глупыми данными выборки:

DECLARE @t TABLE 
    (id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED 
    , name VARCHAR(10) NULL); 
INSERT INTO @t 
VALUES 
    ('dog'), 
    ('cat'), 
    (''), 
    (NULL); 

SELECT * 
FROM @t 
WHERE name <> ''; 

Что вы спрашиваете, двигатель должны вернуть записи, где имя не пустая строка. При оценке четвертой записи определяется, является ли NULL равной пустой строке или нет. NULL может быть пустой строкой, мы не знаем ... учитывая, что значение неизвестно, движок не может включать эту запись, потому что вы запрашиваете только записи, в которых мы знаем, что имя определенно не является пустой строкой.

Рассмотрим еще один запрос к тем же данным:

WITH cteTemp AS 
    (
    SELECT * 
     , isEqualToEmptyString = CASE WHEN name = '' THEN 'true' ELSE 'false' END 
    FROM @t 
    ) 
SELECT * 
FROM cteTemp 
WHERE isEqualToEmptyString = 'false'; 

Теперь это написано, чтобы продемонстрировать точку и есть чистые способы сделать то же самое, но понять, что (например, COALESCE в ответ HLGEM в.) происходит здесь: запрос сначала определяет, какие имена являются пустой строкой (что исключает NULL, поскольку его значение неизвестно), а затем исключая те, которые есть. Таким образом, возвращается NULL.