Postgresql Wählen Sie Zeilen aus, in denen column = array

77

Dies ist eine Zusammenfassung dessen, was ich versuche zu tun:

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

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

Natürlich gibt es einige Syntaxprobleme, aber das ist, was ich tun möchte, und ich habe noch nichts gefunden, das zeigt, wie es geht.

Derzeit ist mein Plan, etwas in diese Richtung zu tun:

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

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

Gibt es in PostgreSQL Unterstützung für die Verwendung eines Arrays zur Suche, oder muss ich etwas Ähnliches wie meine Lösung tun?

Jimmy Pitts
quelle

Antworten:

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

oder ANSI-kompatibel:

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

Die ANYSyntax wird bevorzugt, da das gesamte Array in einer gebundenen Variablen übergeben werden kann:

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

Sie müssten eine Zeichenfolgendarstellung des Arrays übergeben: {1,2}

Quassnoi
quelle
1
Danke, das funktioniert! Am Ende tat ich: ".. some_id = ANY (ARRAY [". Implode (",", $ id_array). "])"
Jimmy Pitts
1
Hallo SQL-Inject mit dem obigen Kommentar ... (implodiere PHP in eine SQL-Abfrage)
Angry 84
Folgendes sollte besser funktionieren: SELECT * FROM Tabelle WHERE some_id = ANY (unnest (? :: INT []))
WhiteWolfza
1
@ WhiteWolfza: Warum denkst du, würde es besser funktionieren?
Quassnoi
Dies scheint die durch die Array-Eingabe definierte Rückgabereihenfolge nicht beizubehalten. dh select id from users where id in (2, 1)und select id from users where id in (1, 2)immer in der gleichen Reihenfolge zurücksenden : 1, 2. Wie kehre ich 2, 1bei der ersten Abfrage zurück?
Yiwen
3

Für dynamisches SQL verwenden Sie:

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

Beispiel

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;

$$;

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

Ufos
quelle
Ich glaube nicht, dass = IN die richtige Syntax ist
FlavorScape
@ FlavorScape, oh mein - behoben! Trotzdem lief es perfekt (ofc ich teste ein Beispiel, das ich poste ...), aber das sieht definitiv besser aus ohne das "="
Ufos
definitiv scheitert mit PostgreSQL-Treiber
FlavorScape
2
   $array[0] = 1;
   $array[2] = 2;
   $arrayTxt = implode( ',', $array);
   $sql = "SELECT * FROM table WHERE some_id in ($arrayTxt)"
Alejandro Salamanca Mazuelo
quelle
1
Sie müssen auch die Eingabedaten überprüfen: $ nums = array (); foreach ($ array als $ a) if (is_numeric ($ a)) $ nums [] = $ a;
Peschanko
1

In meinem Fall musste ich mit einer Spalte arbeiten, die die Daten enthält, sodass die Verwendung von IN () nicht funktionierte. Vielen Dank an @Quassnoi für seine Beispiele. Hier ist meine Lösung:

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

Ich habe fast 6 Stunden verbracht, bevor ich über die Post gestolpert bin.

jking
quelle