web-dev-qa-db-ja.com

「NOT IN」値リストのMySQL変数形式

型のクエリに変数を設定しようとすると夢中になります:

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;

成功なし。エラーを返すか、値を無視します。

64
luison

このような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()などの関数を使用すると、インデックスを使用できません。

102
juergen d

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)
4
randiel

CONCAT()、パイプコンマ(コンマの代わり)、および少しの「逆論理」を使用することにより、_NOT IN_リストで変数を使用できますが、代わりに-_NOT LIKE_!

例:

_SET @idcamposexcluidos = '|817|803|495|';

SELECT
    *
FROM
    your_table
WHERE
    @idcamposexcluidos NOT LIKE CONCAT('%|', id_campo, '|%');
_

これは、文字列と数値列の両方で同様に機能するはずです。

1
newfurniturey