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 :
ARRAY[1,2,3]
{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!