2009-09-21 29 views
37

私はCASE文を使って、MySQLでストアドプロシージャを使用しています。空の結果セットを選択する方法は?

CASEのELSE節(デフォルトと同じです):空の結果セットを選択して返したいので、ELSEの大文字小文字を処理しないでSQLエラーをスローしないでください。空の結果セットを通常のクエリで行が返されない場合

は、これまでのところ私のような何か使用して、そうするために管理してきました:
Select NULL From users Where False

をしかし、私はこの例では、「ユーザー」のように、既存のテーブルに名前を付ける必要があります。 これは動作しますが、最終的に使用されたテーブル名の名前が変更されたり破棄されたりすると、壊れないより洗練された方法が好まれます。

私はSelect NULL Where Falseを試しましたが、動作しません。

Select NULLを使用すると、空のセットは返されませんが、NULLと名前がNULLの列が1行あります。

+0

実際に存在することを保証できる単一の表がなかったのは奇妙なスキーマです。 – onedaywhen

+0

あなたはそうです。多くのテーブルが存在しますが、問題は、テーブルを1つ選択すると、将来そのテーブルが削除されるか名前が変更されると、あなたが書いたコードは機能しなくなり、何も持たないソフトウェアお互いに関係していますが、一方では一方の変更によって他方が機能しなくなります。それはカップリングと呼ばれ、ソフトウェアでのカップリングは一般的には悪い考えです。 – Petruza

+1

@Petruza:Access/Jetを使用した時代に、私のスキーマには、この目的のための永続的な補助表が 'RowRowTable'として追加されました。 – onedaywhen

答えて

37

MySQLには 'dual'というダミーテーブルがあります。これはあなたが使用できるはずです。

select 
    1 
from 
    dual 
where 
    false 

これは常に空の結果を与えます。

+0

はい。この目的のために「二重」が生まれる。 – Rockallite

+0

残念ながら、この解決策は5.7のMySQLのINサブクエリでは機能しません。 'select 1 in(SELECT 1 FROM dual WHERE FALSE);'は1を返します。@dhruvbirdによって提案された解決策だけが私のために働いた – ENargit

2

これはいかがですか?

SELECT 'MyName' AS EmptyColumn 
FROM dual 
WHERE 'Me' = 'Funny' 
+0

私はこれを試しましたが、Where without Fromを少なくともMySQLでは合法ではないと考えています。 ANSI SQLを使用しないでください。 – Petruza

+0

これはMySQL 5.5で構文エラーを引き起こします。 – Rockallite

8

どの程度

myphpにチェック
SELECT * FROM (SELECT 1) AS TBL WHERE 2=3 

、それはまた、sqliteの中で、おそらく他のDBエンジンで動作します。

+0

良いこれはMySQL 5.5のサブクエリで機能します。 – Rockallite

3

これはおそらくすべてのデータベースで機能します。

SELECT * FROM (SELECT NULL AS col0) AS inner0 WHERE col0 IS NOT NULL; 
1
SELECT * FROM (SELECT NULL) WHERE 0 
+3

問題を解決するコードを提供するときには、それがどのように機能しているかについての簡単な説明を与えて、読者がその違いを理解するために精読する必要はありません。 – Fluffeh

+5

私のバージョンのmysqlに別名を追加する必要がありました: SELECT * FROM(SELECT NULL)WHERE 0; – shark555

15

これはPostgresのとNetezzaの上でテストされ、ほとんどのDB上で動作するはずです:

SELECT NULL LIMIT 0; 
+4

私はこの解決策が一番好きです。 MySQLでも動作します(v5.5)。 – noodl

+1

いいえ、これはMySQLのサブクエリでは機能しません。エラーを発生させる 'このバージョンのMySQLはまだ 'LIMIT&IN/ALL/ANY/SOME subquery'(v5.5)をサポートしていません。だからこの答えはこの質問には適していません。 – Rockallite

+1

LIMITは標準ではないので、明らかに '任意のDB'では動作しません。たとえば、MSSQLまたはDB2を試してみてください。 –

3
SELECT TOP 0 * FROM [dbo].[TableName] 

これは、一定の走査操作者に対する妥当なアプローチ。 PostgreSQLの

+0

と言ってこの回答を更新する必要があります。OPは、回答に必要な既存のテーブル名を指定する必要なくクエリを要求しました。 – Marki555

0

シンプル

SELECT; 

作品。 「不明」と表示されている列もありません。
ただし、それでもまだという1行が取得されています。

+0

それは技術的には空の結果セットではありませんか?どのように 'どこで偽を選択するのですか? –

+0

0行ではなく、0列を返します。 – luckydonald

関連する問題