3 Stimmen

Abfrage WHERE-Klausel mit mehreren OR aus Datei lesen

Ich habe eine Tabelle mit Details zu Datenübertragungen. Eines der Felder ist eine IP, die mit der Übertragung verbunden ist. Ich muss eine Abfrage entwickeln, die mir eine Teilmenge der Zeilen in der Tabelle liefert, die einer der 79 IPs entspricht. In der Tabelle gibt es 608 verschiedene IPs.

Ich habe eine Datei, in der die erforderlichen IPs durch Zeilenumbrüche getrennt sind. Gibt es eine Möglichkeit, eine Abfrage zu entwickeln, die diese Datei liest, um die erforderlichen Zeilen zu erhalten, anstatt jede der IPs manuell einzugeben und durch ein OR zu trennen?

10voto

Erwin Brandstetter Punkte 530399

Wenn Sie den Text mit IPs, die durch Zeilenumbrüche getrennt sind, in der Datenbank oder Ihrem Client haben, würde diese Abfrage den Job erledigen:

Die Liste in ein Array umwandeln, es entfalten und mit der Haupttabelle verknüpfen:

SELECT *
FROM  (SELECT unnest(string_to_array(your_list_of_ips, E'\n')) AS ip) sub
JOIN  data_transfers d USING (ip);

Mehr über die verwendete Funktion finden Sie im Handbuch hier.

SQL COPY

Um direkt aus einer Datei zu importieren, könnten Sie COPY verwenden. Die Datendatei muss sich auf demselben Rechner wie Postgres befinden und Sie müssen ein Datenbank-Superuser dafür sein.

Diesmal haben wir bereits eine einzelne IP pro Zeile:

CREATE TEMP TABLE tmp(ip text);

COPY tmp FROM '/path/to/file';

SELECT *
FROM  tmp
JOIN  data_transfers d USING (ip);

psql \copy

Wenn Ihre Datei auf einem anderen Rechner ist oder wenn Sie keine Superuser-Rechte haben, verwenden Sie stattdessen das (weitgehend) äquivalente \copy von psql. Um es aus der Bash heraus zu tun (wie im Kommentar angefordert):

psql dbname

dbname=# \set ips `cat ips.txt`

dbname=# SELECT *
dbname-# FROM  (SELECT unnest(string_to_array(:'ips', E'\n')) AS ip) sub
dbname-# JOIN  data_transfers d USING (ip);

\set ist die psql-Metakommando zum Setzen einer Variable - in diesem Fall mit dem Inhalt einer Datei.
ips.txt ist Ihre Datei mit IPs.
:'ips' ist die Syntax für einfach-gequotete SQL-Interpolation.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X