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?

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}


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)


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)"

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.