IN
句が空のSQLクエリを実行するとどうなりますか?
例えば:
SELECT user WHERE id IN ();
MySQLはこれを期待どおりに処理しますか(つまり、常にfalse)、そうでない場合、IN
句を動的に構築するときに、アプリケーションはこのケースをどのように処理できますか?
IN
リストを動的に構築しているアプリケーションがあり、それが空になる可能性がある場合、私が時々行うことは、不可能な値でリストを初期化し、それに追加することです。たとえば、それがユーザー名のリストである場合、空の文字列から始めます。これは可能なユーザー名ではないためです。auto_increment ID の場合、実際の値は常に正であるため、-1 を使用します。
不可能な値がないためにこれが実行できない場合は、条件を使用して、句にAND column IN ($values)
式を含めるかどうかを決定する必要があります。WHERE
これにより、結果も0になります。
SELECT id FROM User
WHERE id IN (NULL);
MYSQL 5.6で試しました
有効な構文を使用したこのクエリの最も近い概算は次のとおりです。
SELECT user FROM tbl1 WHERE id IN (SELECT id FROM tbl1 WHERE FALSE);
無条件に空の結果セットを返します。括弧内のサブクエリは常に空のセットを返します。空のセットには値が含まれていないため、空のセットには値が見つかりません。
NULL
IN 演算子を空のままにすることはできません。たとえば、何かを入れる必要があります。ただし、この場合でも、常に(空)NULL
を返すため、期待どおりに動作しません。NULL
考えられる解決策の 1 つは、副選択を追加することです。
例:
SELECT user_id FROM users;
+-----------+
| user_id |
+-----------+
| 1000 |
| 1001 |
| 1002 |
| 1003 |
| 1004 |
| 1005 |
| 1006 |
| 1007 |
| 1008 |
| 1009 |
| 1010 |
+-----------+
SELECT user_id FROM users WHERE user_id NOT IN ();
ERROR: 1064: You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ')' at line 1
SELECT user_id FROM users WHERE user_id NOT IN (NULL);
Empty set (0.0003 sec)
SELECT user_id FROM users WHERE user_id IN (1001, 1002, 1003)
AND user_id NOT IN (SELECT user_id FROM users WHERE user_id IN (NULL));
+---------+
| user_id |
+---------+
| 1001 |
| 1002 |
| 1003 |
+---------+
3 rows in set (0.0004 sec)
クエリを少し変更 (短縮) しますが、少し遅くなると思います。