2017-02-27 1 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 

になり、すべてのSQLデータベースの有効なfirstNameのLIKE NULLですか?

これは常に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、 - 特にNULLと比較するために行われるISを除く)、UNKNOWNもたらすありません。UNKNOWNTRUEではないため、NULLの場合は条件を満たしません。とにかく、場合に@firstName@firstName IS NULLTRUEに評価され、NULLが含まれているので、どのようなその後でLIKE @firstName結果(2つの条件の少なくとも一方がTRUEとき@firstName IS NULL OR firstName LIKE @firstNameTRUEあるので)でもありません。

+0

あなたの答えをありがとう!アップアップされました! – Loc

+0

私はMssql、MySQL、PostgreSQL、SQLiteでLIKE NULLをテストしました。彼らはうまくいった。しかし、Oracleデータベースでは失敗しました。 – Loc

+0

*どのように失敗しましたか? Oracle 11.2では私にとってうまく動作します。そして、私は実際には、どのOracleのバージョンもこれを正しく処理できないと疑う。それは深刻なバグでしょう。 –

0

これまでに質問されています。ここでは良い答えのcoulpeは以下のとおりです。

like '%' does not accept NULL value

Behaviour of NOT LIKE with NULL values

あなたは、単に値がnullである場合は、構文作るチェックしようとしている場合:従業員FROM

SELECT * firstNameのは、IS NULL

(NULLはNULLは常にtrueを返します。これは「WHERE 1 = 1」と同じです)。これがいくらか助けてくれることを願います。

2
LIKE NULL 

は、SQL 92標準をサポートまたは実装するRDBMSにとって意味のある表現ではありません。

最初に、NULL [C.J. Dateに戻る]は「不明」を意味するため、「LIKE」は不明なものは何もありません。

NULLの有効なテストは、「IS NULL」または「IS NOT NULL」だけです。

+0

私はLIKE NULLはRDBMSでは意味がありませんが、有効な構文であり、FALSEと評価されることに同意しますか? – Loc

+0

未定義/動作はSQL 92標準では定義されていません。 MS SQLの動作が他のエンジンで一貫していない。 –

+0

一般的なRDBMSでクエリをテストする必要があります。ありがとう! – Loc

関連する問題