2012-03-15 11 views
0

この質問は本当に基本的なようですが、私はグーグルの答えを見つけることができません。最後の1時間は無駄なくテストしました。私は、一連の行を返そうとするのが難しいです。 11、1、またはNullに等しい行が必要です。私はそれが私を台無しにしているNullだと思う。以下は、私が走った多くのテストのうちの1つだけです...そして、私はそれがうまくいかないことを知っています。どんな助けでも本当に感謝しています。事前に感謝sql NULLまたは別の値に一致するSELECTの戻り値

SELECT * FROM have 
    WHERE have.flag = 11 || 1 || NULL; 

答えて

4

はその後、自分のwhere句に値を入れ、111別にNULLを処理する必要があります。

ただ、代替として
SELECT * 
FROM have AS h 
WHERE h.flag IS NULL 
    OR h.flag IN (1, 11); 
+0

実際には、 '||'はMySQLで論理ORを意味します:http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html#operator_or –

+0

@muistooshort '||'はこれまで見たことがなかった。 –

+0

MySQLは文字列連結のために 'CONCAT'関数を使用します。 –

1

SELECT * 
FROM have 
WHERE nullif(nullif(flag,1),11) IS NULL 
+0

列に対する関数は、WHERE条件にインデックスを使用する機能を無効にしませんか? – Ami

+0

インデックスがあると仮定すると、それは一般的に真です。 MySQLがどのようにインデックスを扱うかは不明ですが、Postgresではインデックス関数を使用できます。それでも、質問が明記されていなくても、明快さとその理由についてアダムの答えについていくつもりです。 - 私はこの答えが教育的な選択肢であることを意味しました。 – vol7ron

1

また、あなたが

select * from have as h where 
IFNULL(h.flag,1) in (1,11) 
+0

最初の '11'を' 1'に変更する必要があります: – vol7ron

+0

@ vol7ron私はそれを見ませんでした。ありがとう! –

+0

それは何かを作るか、壊すつもりはありません。 'have_flag'も単に' flag'に変更することができます – vol7ron

1

のために行くことができます。これは説明です:あなたが述べている何

SELECT * FROM have 
    WHERE have.flag = 11 || 1 || NULL; 

は実際にあります:

(have.flag = 11) || 1  || NULL 
true || 1     || NULL 
1       || NULL 
1 


(have.flag = 11) || 1  || NULL 
false || 1     || NULL 
1       || NULL 
1 

それは常に1
=と評価されますが||よりも優先順位が高いです。
@Adam Wengerの答えは正しいです。

+0

真。最も簡単な場合でも、クエリはWHERE has.flag = 1 || have.flag = 11 ||フラグはNULLである。列はWHERE条件の各条件に含まれていなければなりません。 – Ami

関連する問題