型のクエリに変数を設定しようとすると夢中になります:
SET @idcamposexcluidos='817,803,495';
だから私はそれを使用することができます
WHERE id_campo not in (@idcamposexcluidos)
私は運のないさまざまな形式で変数を定義しようとしましたが、上記の特定の例を見つけることができないようです:
SET @idcamposexcluidos='(817,803,495)';
...
WHERE id_campo not in @idcamposexcluidos
SET @idcamposexcluidos=817,803,495;
成功なし。エラーを返すか、値を無視します。
このようなIN
句は使用できません。 IN
句のsingle文字列にコンパイルします。ただし、IN
句にはseparate値が必要です。
_WHERE id_campo not in (@idcamposexcluidos)
_
にコンパイルする
_WHERE id_campo not in ('817,803,495')
_
しかし、それはあるべきです
_WHERE id_campo not in ('817','803','495')
_
これを克服するには、動的SQLを使用するか、MySQLで FIND_IN_SET を使用します。
_SET @idcamposexcluidos='817,803,495';
...
WHERE FIND_IN_SET(id_campo, @idcamposexcluidos) = 0
_
ただし、FIND_IN_SET()
などの関数を使用すると、インデックスを使用できません。
mysql> 5.1を使用する場合、次を使用できます。
CREATE TYPE lista as (
clave int4,
valor int4
);
CREATE OR REPLACE FUNCTION test(IN vArray lista[])
...
WHERE FIND_IN_SET(id_campo, vArray)
...
それ以外の場合は、トリックを使用できます。
WHERE id_campo IN ( SELECT 817 as valor UNION ALL
SELECT 803 as valor UNION ALL
SELECT 495 as valor)
CONCAT()
、パイプコンマ(コンマの代わり)、および少しの「逆論理」を使用することにより、_NOT IN
_リストで変数を使用できますが、代わりに-_NOT LIKE
_!
例:
_SET @idcamposexcluidos = '|817|803|495|';
SELECT
*
FROM
your_table
WHERE
@idcamposexcluidos NOT LIKE CONCAT('%|', id_campo, '|%');
_
これは、文字列と数値列の両方で同様に機能するはずです。