2017-02-27 114 views
0

我有一個簡單的查詢(實際查詢將更加複雜,它是一個動態的查詢)SQL LIKE NULL是否爲所有數據庫的有效語法?

SELECT * FROM Employee WHERE @firstName IS NULL OR firstName LIKE @firstName 

@firstName將原樣傳遞

  • NULL
  • '%名稱%'

當@firstName作爲'%name%'傳遞時。該查詢將正常工作。

當@firstName作爲NULL傳遞時。該查詢將

SELECT * FROM Employee WHERE NULL IS NULL OR firstName LIKE NULL 

// This query is valid syntax on MSSQL and return all employees 
// because NULL IS NULL evaluated as TRUE 
// And firstName LIKE NULL evaluated as FALSE -- I guess 

我的問題是

的firstName LIKE NULL上的所有SQL數據庫都有效?

它會一直評估爲FALSE嗎?

我已經檢查了這樣的語法https://www.w3schools.com/SQl/sql_like.asp

https://msdn.microsoft.com/en-us/library/ms179859.aspx

但我沒有找到我的答案。謝謝!

回答

1

是的,LIKE NULL在所有RDBMS中都有效。 LIKE是一個運算符,後跟一個字符串,一個字符串可以爲null;所以沒問題。

值相較於NULL,不管是什麼運營商(<<==<>LIKE等 - 除了IS其中特別提出與NULL比較),結果UNKNOWNUNKNOWN不是TRUE,所以在NULL的情況下不符合條件。不管怎樣,如果@firstName包含NULL@firstName IS NULL計算結果爲TRUE,所以它甚至不不管什麼LIKE @firstName結果,然後(因爲@firstName IS NULL OR firstName LIKE @firstNameTRUE當兩個條件至少有一個是TRUE)。

+0

謝謝你的回答! Upvoted! – Loc

+0

我在Mssql,MySQL,PostgreSQL,SQLite上測試了LIKE NULL。他們工作得很好。但是它在Oracle數據庫上失敗了。 – Loc

+0

*如何失敗?在Oracle 11.2中它對我來說工作得很好。我真的懷疑任何Oracle版本都不能正確處理這個問題。這將是一個嚴重的錯誤。 –

2
LIKE NULL 

對於支持或實現SQL 92標準的RDBMS不是一個有意義的表達式。

首先,NULL [回到C.J.日期]意味着「未知」,所以沒有什麼可以是'LIKE'未知。

NULL的唯一有效測試是「IS NULL」或「IS NOT NULL」。

+0

我同意LIKE NULL對於RDBMS沒有意義,但它是否有效的語法並將被評估爲FALSE? – Loc

+0

未定義/行爲未在SQL 92標準中定義。 MS SQL行爲在其他引擎中不一致。 –

+0

我需要測試一些流行的RDBMS上的查詢。謝謝! – Loc

相關問題