116 votes

Postgresql Select rows where column = array

Voici un résumé de ce que j'essaie de faire :

$array[0] = 1;
$array[1] = 2;

$sql = "SELECT * FROM table WHERE some_id = $array"

Il y a évidemment des problèmes de syntaxe, mais c'est ce que je veux faire, et je n'ai encore rien trouvé qui montre comment le faire.

Pour l'instant, j'ai l'intention de faire quelque chose dans ce sens :

foreach($idList as $is)
    $where .= 'some_id=' . $id . ' OR';
endforeach

$sql = "SELECT * FROM table WHERE " . $where;

PostgreSQL permet-il d'utiliser un tableau pour la recherche, ou dois-je faire quelque chose de similaire à ma solution ?

214voto

Quassnoi Points 191041
SELECT  *
FROM    table
WHERE   some_id = ANY(ARRAY[1, 2])

ou ANSI -compatible :

SELECT  *
FROM    table
WHERE   some_id IN (1, 2)

Les ANY est préférable car le tableau dans son ensemble peut être transmis dans une variable liée :

SELECT  *
FROM    table
WHERE   some_id = ANY(?::INT[])

Vous devez transmettre une représentation sous forme de chaîne de caractères du tableau : {1,2}

7voto

Ufos Points 925

Pour une utilisation SQL dynamique :

'IN(' ||array_to_string(some_array, ',')||')'

Exemple

DO LANGUAGE PLPGSQL $$

DECLARE
    some_array bigint[];
    sql_statement text;

BEGIN

    SELECT array[1, 2] INTO some_array;
    RAISE NOTICE '%', some_array;

    sql_statement := 'SELECT * FROM my_table WHERE my_column IN(' ||array_to_string(some_array, ',')||')';
    RAISE NOTICE '%', sql_statement;

END;

$$;

Résultat : NOTICE: {1,2} NOTICE: SELECT * FROM my_table WHERE my_column IN(1,2)

5voto

jking Points 51

Dans mon cas, j'avais besoin de travailler avec une colonne contenant les données, donc l'utilisation de IN() ne fonctionnait pas. Merci à @Quassnoi pour ses exemples. Voici ma solution :

SELECT column(s) FROM table WHERE expr|column = ANY(STRING_TO_ARRAY(column,',')::INT[])

J'ai passé près de 6 heures avant de tomber sur cet article.

3voto

   $array[0] = 1;
   $array[2] = 2;
   $arrayTxt = implode( ',', $array);
   $sql = "SELECT * FROM table WHERE some_id in ($arrayTxt)"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X