2010-12-08 13 views
4

よろしくお願い致します。MySQLのNULL質問

こんにちはすべて - 私は詳細を説明している必要があります - そのcrieriaに一致する行がないため、現在のクエリの結果は正しいです(つまりゼロ行)が、代わりにMySQLにこれを返すように強制できますか?

q1  q2  q3 
NULL NULL NULL 

私は以下の回答ではないと思われます。

多分乾杯、

H.

こんにちはすべて、

これは本当に、本当に簡単な質問が、私は困惑!

私は次のクエリを持っている:

SELECT q1, q2, q3 FROM tresults WHERE date = 'NOV2010' AND brand = 'XYZ' 

、Q1、Q2、Q3はNOV2010とXYZのために空になっている場合、クエリの結果は次のとおりです。

MySQL returned an empty result set (i.e. zero rows). 

私はしかし必要なもの、 MySQLが代わりにNULLを返すように強制することです。たとえば、クエリでは次のようになります。

q1  q2  q3 
NULL NULL NULL 

私はそれがde広告は簡単ですが、私が言うように、私は困惑しています。

ありがとう、

ホーマー

+0

を動作するはずですあなたは、あなたが日付とブランドがあなたの状態をsatisifyながらQ1、Q2、およびQ3がすべてNULLで行を持って知っている意味、あなたはその列を取得していないのですか? – n8wrl

+0

q変数のデータ型は? –

+0

空のレコードセットではなく、すべてNULLのフィールドを持つレコードを返す必要があるということは、私が特殊なユースケースとして私に襲いかかってきます。あなたが何をしているのかを記述すると、より有益な答えが得られるかもしれません。 –

答えて

4

私はそれが簡単ではないと思います。私はこれをしなければならなかった場合、私は私がLEFTを使用すると思いますが、JOIN:ここ

SELECT q1, q2, q3 
FROM (SELECT NULL AS foo) T1 
LEFT JOIN tresults ON date = 'NOV2010' AND brand = 'XYZ' 

はQ1がNULL可能でないと、あなただけの1行が必要な場合は動作します別のアプローチです:他の人が持っていたよう

SELECT q1, q2, q3 FROM tresults WHERE date = 'NOV2010' AND brand = 'XYZ' 
UNION ALL 
SELECT NULL, NULL, NULL 
ORDER BY q1 DESC 
LIMIT 1 
+0

+1私はあなたがSELECTクエリのcol1のようなその内側のクエリのための列エイリアスを指定する必要があると信じています - 少なくとも、それはSQL Serverの場合です - そうでなければ、このアプローチは動作するように見えるので、それはdownvotedされました。 –

+0

@djacobson:私はそれがMySQLで必要とは思わない - 私はそれをローカルでテストし、うまく動作します。とにかく移植性の理由から追加することができます。 –

+0

いいですね。そして、緑のチェックマークで明らかなように、円は今完成しました。 :) –

1

あなたの質問が正確で、実際にという3つのNULLを持つ行があるとすれば、MySQLはそれを返すと期待します。そうでない場合は、null以外の値の選択を強制することができます:あなたのDBは、しかし、基準を満たすtresultsのレコードを持っていない場合は

SELECT q1, q2, q3, 1 AS dummy 
FROM tresults 
WHERE date = 'NOV2010' AND brand = 'XYZ' 

は、あなたがSOLている - がありますDBにレコードがないので、MySQLは何も返さないでしょう。

+0

ええ、私は恐れているかもしれません。データベースにはレコードがありませんが、代わりにNULLを返す必要があります。 –

+0

なぜこれを返す必要がありますか? 3つの空の値が空の結果セットよりも優れているのはなぜですか?あなたのアプリケーションはどちらの場合も処理できるはずです。 – cdhowie

0

すでにそのように動作しています。行がゼロの場合、WHERE句に一致する行はありません。

編集:あなたのアップデートでは、私はあなたがそれを行うことはできないと思います。あなたのアプリケーションロジックは、そのロジックを処理する場所です。

+0

WHERE句に一致する行が1つありますが、選択した列はすべてNULLに等しいと言っています。私はこれがすべてのnullの単一の行を返すと思っただろうが、私はそうは思わない。 – Tenner

+0

** **すべてのヌルの単一の行を返します**。彼はどこかでミスをした。 – ceejayoz

+1

自分でテストしたところ、あなたは正しいです。奇妙なことが起こっている。 – Tenner

1

本当に何が起こるべきかはあなたが期待していることです。あなたのデータベースにNOV2010とXYZのエントリが含まれていることをもう一度確認してください(多分NOVのOは誤って0などの入力ミスですか?)

これを行うとどうなりますか?非常に珍しいものが行うことができるようにしたいようだ -

SELECT * FROM tresults WHERE date = 'NOV2010' AND brand = 'XYZ'

2

あなたのクエリに一致するレコードがないときに空の結果セットではなく "NULL"レコードを返すことは珍しいことであり、それをサポートするための非常にエレガントな方法はわかりません。 1つのオプションは以下のようにレコードセットをUNIONすることです:

SELECT q1, q2, q3 FROM tresults WHERE date = 'NOV2010' AND brand = 'XYZ' 
UNION 
SELECT NULL AS q1, NULL AS q2, NULL AS q3 

これは、あなたが常に結果セットを取得することが保証されますが、それはまた、「NULL」のレコードが最初のクエリリターンを行う場合でも、あなたの結果セットに追加されることを意味しますレコード...

これは、@ ceejayozの答えによると、これはアプリケーションロジックでよりうまく処理されます。 なぜ詳細あなたはこの結果が必要ですか?

+0

継承されたコード - それはアプリケーションコードで大混乱を避けるでしょう - しかし、それができないなら私は手を汚さなければならないでしょう! –

+1

@Homer_J @マークバイヤーズの答えをチェックすることができます。それはちょっと変わったことではありません。 :) –

2

あなただけの1つのまたは0の行を期待している場合、これは

SELECT q1,q2,q3 FROM 
    (
    SELECT q1, q2, q3 FROM tresults WHERE date = 'NOV2010' AND brand = 'XYZ' 
    UNION 
    SELECT NULL AS q1, NULL AS q2 NULL AS q3 
    ) sq 
ORDER BY q1 DESC LIMIT 1;