2012-11-03 21 views
30

IN句が空のSQLクエリを実行するとどうなりますか?例えばMySQLの空のIN節パラメータリスト

:動的IN句を構築する場合、予想通り

SELECT user WHERE id IN(); 

MySQLは(それは常に、偽である)これを処理し、そうでない場合は、どのように私のアプリケーションは、このケースを扱うことができますか?

+9

自分で試してみませんか? –

+0

空のセットには何もないので、idカラムの値は明らかに空のセットにはありません。また、構文が正しくないことが判明しました。 http://sqlfiddle.com/#!2/a2581/2412 –

+9

私はこれを聞いても構いませんが、すでにここで見つけるのが便利でした。 –

答えて

10

有効な構文を使用して、クエリの最も近い近似値は次のとおりです。無条件に空の結果セットを返します

SELECT user FROM tbl1 WHERE id IN (SELECT id FROM tbl1 WHERE FALSE); 

。ブラケットのサブクエリは常に空のセットを返します。空のセットには値が含まれていないので、前述したように空のセットには値はありません。

+3

空のセットを返す別のサブクエリは '(select top 0 0)'です。これはテーブル名を必要としないという利点があります。 – benrwb

+4

これは、文字通り 'IN'リストを動的に生成している場合には本当に役立ちません。彼は空の 'IN'節を作る方法を探していないので、彼は空の配列を与えられているので偶然に起こるときにそれをどう扱うかを知りたい。 – Barmar

+0

または単純に 'SELECT user FROM tbl1 WHERE id IN(FALSE) ' –

32

私がINリストを動的に構築しているアプリケーションがあり、それが空になることがある場合、時には不可能な値でリストを初期化して追加することがあります。例えば。それがユーザ名のリストであれば、可能なユーザ名ではないので空の文字列で始めます。 auto_increment IDの場合、実際の値は常に正であるため、-1を使用します。

不可能な値がないため実行できない場合は、AND column IN ($values)式をWHERE句に含めるかどうかを条件付きで判断する必要があります。

0

あなたはちょうどそうのような条件を設定できます。

$condition = 'FALSE' // Could feasibly want TRUE under different circumstances 
if($values){ 
    $condition = *dynamically_generate_IN_condition_from_values* 
} 

$sql = 'SELECT * FROM `user` WHERE '.$condition; 
7

これは、同様に私に0の結果を与える:MYSQL 5.6

+2

これは、 'id IN(NULL)'が 'FALSE'ではなく' NULL'に評価されるので問題になる可能性があります。これは主に 'NOT IN'の問題です:' SELECT id FROMユーザはどこにいないのですか(NULL); 'は0の結果も返します。 – MicahStetson

0

試着

SELECT id FROM User 
WHERE id IN (NULL); 

は常に虚偽の陳述

を使用します

SQLを作成する前に、配列のサイズを確認してください。 サイズはのように、1 = 2としてどこ文を生成し、0の場合:

SELECT * FROM USERS WHERE name in() 

でいつものように真のステートメントを生成し、空の配列に "NOT IN" のために

SELECT * FROM USERS WHERE 1 = 2 

次のようになります。

SELECT * FROM USERS WHERE name not in() 

SELECT * FROM USERS WHERE 1 = 1 
なり、

ように、これは、より複雑なクエリのために働く必要があります。配列が空の場合は、idのAUTO_INCREMENT(1,2,3、...)を使用している場合

SELECT * FROM USERS WHERE (name in() OR name = 'Alice') 

SELECT * FROM USERS WHERE (1 = 2 OR name = 'Alice') 
0

になりますが、アイテム[0]を1つ追加できます。したがって、それはなります

if (empty($arr)) { 
    $arr[] = 0; 
} 

SELECT user WHERE id IN (0); 

そして、mysqlの解析エラーはありません。