Maison >base de données >tutoriel mysql >Quand dois-je utiliser ANY au lieu de IN dans une clause WHERE ?

Quand dois-je utiliser ANY au lieu de IN dans une clause WHERE ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-14 20:37:44295parcourir

When Should I Use ANY Instead of IN in a WHERE Clause?

Comment utiliser ANY au lieu de IN dans la clause WHERE

Supposons que vous ayez une requête comme MyModel.where(id: ids) dans Rails qui génère du SQL en utilisant IN contenant une liste d'identifiants :

<code class="language-sql">SELECT "my_models".* FROM "my_models"
WHERE  "my_models".`"id"` IN (1, 28, 7, 8, 12)</code>

Pour utiliser ANY au lieu de IN, vous pouvez essayer :

<code class="language-ruby">MyModel.where("id = ANY(VALUES(#{ids.join '),('}))")</code>

Cependant, lorsque le tableau ids est vide, cette approche échoue et entraîne une erreur de syntaxe SQL.

Comprendre IN et ANY

Les expressions IN et ANY ont deux formes :

  • expression IN (subquery)
  • expression IN (value [, ...]) ou expression ANY (array expression)

Pour la deuxième forme, IN attend une liste de valeurs, tandis que ANY attend un tableau.

Quand utiliser ANY et IN

ANY est une option plus générale qui peut être utilisée avec n'importe quel opérateur renvoyant une valeur booléenne. IN est un cas particulier de ANY.

En termes de performances, ANY n'est jamais plus rapide que = ANY, et = ANY n'est pas beaucoup plus rapide que IN. Le choix doit être basé sur la commodité.

Si l'ID provient d'une base de données, il est plus efficace d'utiliser une sous-requête ou JOIN. Pour de meilleures performances lors de la transmission de longues listes de valeurs du client, envisagez d'utiliser des tableaux, des expressions unnest() ou VALUES.

= Syntaxe de ANY

Postgres accepte les formes suivantes d'expressions de tableau :

  • Constructeur de tableau : ARRAY[1,2,3]
  • Tableau littéral : {1,2,3}

Pour éviter la conversion de type, convertissez le tableau explicitement : ARRAY[1,2,3]::numeric[].

Comment transmettre un tableau depuis Ruby

Supposons que id soit un entier :

<code class="language-ruby">MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn