[英]SQL Server where column in where clause is null
假設我們有一個名為Id
和Weather
列的Data
表。 該表中的其他列對於此問題並不重要。 Weather
列可以為空。
我想顯示Weather
符合條件的所有行,但是如果weather
有空值,則顯示空值。
到目前為止,我的SQL:
SELECT *
FROM Data d
WHERE (d.Weather LIKE '%'+COALESCE(NULLIF('',''),'sunny')+'%' OR d.Weather IS NULL)
我的結果是錯誤的,因為如果條件不正確,該語句還會顯示Weather
為null的值(假設用戶鍵入錯誤)。
我找到了類似的主題,但是找不到合適的答案。 當字段具有NULL值時,SQL WHERE子句不返回行
請幫幫我。
對於將NULL
視為匹配項的一般任務,您的查詢是正確的。 如果希望在沒有其他結果時抑制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
視為匹配項。
您還可以使用公用表表達式來避免重復查詢,如下所示:
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為null的值(假設用戶輸入的sunny錯誤)。
這表明恆定的'sunny'
來自最終用戶的輸入。 在這種情況下,您需要參數化查詢以避免SQL注入攻擊 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.