2014-01-03 2 views
2

Предположим, что у нас есть таблица с именем Data с Id и Weather столбцами. Другие столбцы в этой таблице не важны для этой проблемы. Столбец Weather может быть нулевым.SQL Server, где столбец в where: null

Я хочу показать все строки, где Weather подходит к условию, но если есть нулевое значение в weather, тогда отобразите нулевое значение.

My SQL до сих пор:

SELECT * 
FROM Data d 
WHERE (d.Weather LIKE '%'+COALESCE(NULLIF('',''),'sunny')+'%' OR d.Weather IS NULL) 

Мои результаты являются неправильными, потому что это утверждение также показывает значения, где Weather является нулевое значение, если условие не является правильным (допустим, что пользователи неправильно набранный неправильно).

Я нашел похожие темы, но там я не нашел подходящего ответа. SQL WHERE clause not returning rows when field has NULL value

Пожалуйста, помогите мне.

+0

Запрос будет возвращать строки, в которых погода похожа на то, что пользователь вводил или где Погода равна нулю. Вы говорите, что пользователь вводит что-то, кроме «солнечного», вы хотите ничего не возвращать, даже нулевые значения? –

+0

Да, это правильно. – michael24B

+0

Я не понял ваши требования !!! – user2727841

ответ

3

Ваш вопрос относится к общему правилу обработки NULL s в качестве соответствия. Если вы хотите, чтобы подавить NULL сек, когда нет никаких других результатов, вы можете добавить AND EXISTS ... условия запроса, как это:

SELECT * 
FROM Data d 
WHERE d.Weather LIKE '%'+COALESCE(NULLIF('',''),'sunny')+'%' 
    OR (d.Weather IS NULL AND EXISTS (SELECT * FROM Data dd WHERE dd.Weather LIKE '%'+COALESCE(NULLIF('',''),'sunny')+'%')) 

Дополнительное условие гарантирует, что NULL s рассматривается как спички, только если другие совпадающих записи существовать.

Вы также можете использовать common table expression, чтобы избежать дублирования запроса, как это:

WITH cte (id, weather) AS 
(
    SELECT * 
    FROM Data d 
    WHERE d.Weather LIKE '%'+COALESCE(NULLIF('',''),'sunny')+'%' 
) 
SELECT * FROM cte 
UNION ALL 
SELECT * FROM Data WHERE weather is NULL AND EXISTS (SELECT * FROM cte) 

заявление показать также значения где Wether равно нулю, если условие не является правильным (скажем, что пользователи набрали неправильный солнечный) ,

Это означает, что константа 'sunny' поступает с входа конечного пользователя. Если это так, вам нужно параметризовать свой запрос, чтобы избежать SQL injection attacks.

+0

Спасибо за это. Кажется, все в порядке. – michael24B

Смежные вопросы