2017-02-13 4 views
4

条件の別の値と値を比較し、この値がNULLであるかどうかを示す準備済みの文を書く方法がありますか?私はa1 => nulla2 => 42で、このプリペアドステートメントを使用する場合は条件にNULL値を含む準備済みの文を書き込む

SELECT `foo` FROM `bar` WHERE `a1` = :a1 AND `a2` = :a2 

、その結果のクエリは次のようになります。

SELECT `foo` FROM `bar` WHERE `a1` = NULL AND `a2` = '42' 

これは私が欲しいもの、もちろん、ではありません。私はそのような場合にはこれが必要になります。

​​

a1a2の両方がNULL可能です。私は4の書類を作成定義する必要はありません:

-- I would use this, if both values are not null 
SELECT `foo` FROM `bar` WHERE `a1` = :a1 AND `a2` = :a2 

-- and this, if the expected value of a1 is null 
SELECT `foo` FROM `bar` WHERE `a1` IS NULL AND `a2` = :a2 

-- and this, if the expected value of a2 is null 
SELECT `foo` FROM `bar` WHERE `a1` = :a1 AND `a2` IS NULL 

-- and this, if I would expect both values to be null 
SELECT `foo` FROM `bar` WHERE `a1` IS NULL AND `a2` IS NULL 

答えて

4

MySQLは、NULLで安全な比較<=>(宇宙船)演算子を提供します。 TRUEまたはFALSEを返す等価比較を指定し、どちらかのオペランドがNULLの場合はNULLを返しません。

SELECT NULL=NULL 
    , NULL<=>NULL 
    , 1=NULL 
    , 1<=>NULL 
    , 1=0 
    , 1<=>0 
    , 1=1 
    , 1<=>1 

戻り値:

NULL=NULL NULL<=>NULL 1=NULL 1<=>NULL  1=0 1<=>0  1=1 1<=>1 
--------- ----------- ------ -------- ------ ----- ------ ----- 
    (NULL)   1 (NULL)   0  0  0  1  1 

比較操作は基本的に省略形であることの実証として

。以下からの復帰:

a <=> b 

はあなたが尋ねた質問に答えるために

(a = b OR (a IS NULL AND b IS NULL)) 

からのリターンに相当し、我々はNULLセーフ比較<=>(宇宙船を使用して文を書くことができ)演算子です。

SELECT `foo` 
    FROM `bar` 
    WHERE `a1` <=> :a1 
    AND `a2` <=> :a2 

あるいは、より多くのANSI規格に準拠し、ポータブルなアプローチのために、我々はこのように、そのMySQLの特定の演算子を使用せずに同じ結果を得ることができます:私たちは、各バインドの値を渡す必要があり

SELECT `foo` 
    FROM `bar` 
    WHERE (`a1` = :a1 OR (`a1` IS NULL AND :a1d IS NULL)) 
    AND (`a2` = :a2 OR (`a2` IS NULL AND :a2d IS NULL)) 

注意値は2回です。以前は、PDOはバインドプレースホルダへの複数の参照を許可していませんでした。 (これはPDOの最近のバージョンでは、まだケースであるかどうかわからない。)この問題を回避するには、上記実証されたように、声明の中で個別のプレースホルダを使用し、:a1:a1dに同じ値を供給することである。)

+0

ありがとうございました!その演算子を知りませんでした(そして、自分自身で「OR」を使って解決策を見つけた可能性があります)。 – stofl

+1

@stofl:これは役に立ちました。私が十分に強調していないものを強調するために、** <=> **比較演算子はMySQLで*非標準*拡張子*のみ*です。 (少なくとも、私はこの演算子をサポートする他のどのDBMSも認識していません。) – spencer7593

+0

ありがとうございます。私の場合は関係ありません。なぜなら、とにかくdbmsを独立させているわけではないからです。 – stofl

関連する問題