81

次のタイプのクエリで変数を設定しようとすると、頭がおかしくなります。

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;

成功しませんでした。エラーを返すか、値を無視します。

4

3 に答える 3

134

You can't use the IN clause like that. It compiles to a single string in your IN clause. But an IN clause needs separate values.

WHERE id_campo not in (@idcamposexcluidos)

compiles to

WHERE id_campo not in ('817,803,495')

but it should be

WHERE id_campo not in ('817','803','495')

To overcome this either use dynamic SQL or in MySQL you could use FIND_IN_SET:

SET @idcamposexcluidos='817,803,495';
...
WHERE FIND_IN_SET(id_campo, @idcamposexcluidos) = 0

but using a function like FIND_IN_SET() can not make use of indexes.

于 2012-08-14T17:35:27.160 に答える
4

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)
于 2012-08-14T18:19:39.760 に答える
2

CONCAT()パイプ区切り文字 (カンマの代わりに)、および少しの「逆ロジック」を使用することで、NOT INリストで変数を使用できますが、代わりにNOT LIKE!を使用します。

例:

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

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

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

于 2012-08-14T17:56:49.747 に答える