UM DURCH die IN-Wert-Liste
Ich habe eine einfache SQL-Abfrage in PostgreSQL 8.3, schnappt sich ein paar der Kommentare. Ich biete eine sortiert Liste der Werte, die IN
Konstrukt in der WHERE
Klausel:
SELECT * FROM comments WHERE (comments.id IN (1,3,2,4));
Diese gibt Kommentare, die in einer beliebigen Reihenfolge, die in meinem passiert sein ids wie 1,2,3,4
.
Ich will, dass die resultierenden Zeilen sortiert wie in der Liste der IN
konstruieren: (1,3,2,4)
.
Wie erreichen Sie das?
Und ich würde es vorziehen, nicht eine neue Tabelle zu erstellen, nur für die Sortierung (trotz der SQL-Reinheit).
Ich habe ein Bündel von Antworten. Kann ich die Abstimmung und Kommentare, damit ich weiß, das ist der Gewinner! Vielen Dank An Alle 🙂
Ich habe ein Bündel von Antworten. Kann ich die Abstimmung und Kommentare, damit ich weiß, das ist der Gewinner! Vielen Dank An Alle 🙂
InformationsquelleAutor nutcracker | 2009-05-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie können es ganz einfach mit (Einführung in PostgreSQL 8.2) - WERTE (), ().
Syntax wird wie folgt Aussehen:
danke. dies funktioniert auch in SQL Server
Was ist, wenn es gibt Tausende Werte in der IN-Klausel? weil ich habe, es zu tun für Tausende Datensätze
Für die, die ich verwendet haben
with ordered_products as (select row_number() OVER (ORDER BY whatever) as reportingorder, id from comments) ... ORDER BY reportingorder
.InformationsquelleAutor
Gerade weil es so schwer zu finden sein, und es muss verteilt werden: in mySQL ist das alles viel einfacher, aber ich weiß nicht, ob es funktioniert in anderen SQL.
Die Liste der Werte, die zur Verfügung gestellt werden zweimal, in zwei verschiedenen Möglichkeiten. Gar nicht so einfach. Die akzeptierte Antwort muss nur einmal (auch wenn in einer ausführlicheren Art und Weise). Und es ist sogar einfacher, mit modernen Postgres (wie gezeigt in neueren Antworten). Auch diese Frage scheint zu sein, über Postgres nach alle.
ERROR: cannot pass more than 100 arguments to a function
naja ich hab das gleiche problem...
InformationsquelleAutor das oe
Ich denke, dieser Weg ist besser :
... order by id=? desc, id=? desc, id=? desc
und es scheint zu funktionieren 🙂Dies funktionierte nicht für mich.
Arbeitet in postgres und scheint die beste Lösung zu sein!
FEHLER: target-Listen können bei den meisten 1664 Einträge -> wenn Sie versuchen, führen lange Abfrage...
in sql ? Welche?
InformationsquelleAutor vantrung -cuncon
In Postgres 9.4 oder später, das ist wahrscheinlich einfachste und Schnellste:
Mithilfe der neuen
MIT ORDINALITY
, dass @a_horse bereits erwähnt.Brauchen wir nicht eine Unterabfrage, wir können das Cmdlet set-returning Funktion, wie eine Tabelle.
Einem string-literal zu, die hand in das array, anstatt ein ARRAY-Konstruktor werden können, einfacher zu implementieren, mit einigen clients.
Ausführliche Erklärung:
InformationsquelleAutor Erwin Brandstetter
Anderen Weg, es zu tun in Postgres wäre, um die
idx
Funktion.Vergessen Sie nicht, erstellen Sie die
idx
Funktion zuerst, wie hier beschrieben: http://wiki.postgresql.org/wiki/Array_IndexCREATE EXTENSION intarray;
.Nur drängen auf weitere, für Benutzer von Amazon RDS, die ROR-migration-Funktion
enable_extension
wird zulassen, aktivieren Sie dies so lange, wie Sie Ihre app-Benutzer ist ein Mitglied derrds_superuser
Gruppe.in PG 9.6.2 PG::UndefinedFunction: FEHLER: Funktion idx(integer[], integer) existiert nicht
Danke, beste Antwort, wenn Sie kombiniert werden mit @AlexKahn Kommentar
InformationsquelleAutor Carl Mercier
Mit Postgres 9.4 diese kann getan werden, ein wenig kürzer:
Entfernen die Notwendigkeit, manuell ordnen/halten einer position auf jeden Wert.
Mit Postgres 9.6 dies kann mit
array_position()
:Den Allgemeinen Tabellenausdruck verwendet wird, so dass die Liste der Werte muss nur einmal angegeben werden. Wenn das nicht wichtig, dies kann auch geschrieben werden als:
IN
Liste aus derWHERE
- Klausel wieder in dieORDER BY
Klausel, die macht dieses die beste Lösung imho... Jetzt nur noch etwas finden, ähnlich wie bei MySQL...InformationsquelleAutor a_horse_with_no_name
In Postgresql:
position(id::text in '123,345,3,678')
. Die id3
passen wird, bevor die id345
ist, nicht es?Ich glaube, Sie haben Recht und würde müssen sowohl ein start-und end-delimiter dann, vielleicht wie: order by position(','||id::text||',' in ',1,3,2,4,')
InformationsquelleAutor Clodoaldo Neto
Auf die Erforschung dieser etwas mehr fand ich diese Lösung:
Jedoch scheint dies eher ausführliche und könnte von performance-Problemen mit großen Datenmengen.
Kann jeder Kommentar über diese Themen?
Hmmm ... Ist, dass basierend auf den persönlichen Erfahrungen und Tests? Meine bewährte Erfahrung ist, dass dies eine sehr effektive Technik für die Bestellung. (Allerdings ist die akzeptierte Antwort ist insgesamt besser, weil es beseitigt die "( ... ) " - Klausel). Denken Sie daran, dass für jeden vernünftigen Ergebnis set-Größe, Ableitung der Menge als das teure Teil. Sobald es sich um mehrere hundert Datensätze oder weniger, die Sortierung ist trivial.
Was ist, wenn es gibt Tausende Werte in
IN
- Klausel? weil ich habe, es zu tun für Tausende von Datensätzen.InformationsquelleAutor nutcracker
Um dies zu tun, ich denke, Sie sollten wahrscheinlich eine zusätzliche "ORDER" - Tabelle definiert die Zuordnung von IDs zu bestellen ist (effektiv das tun, was Ihre Antwort auf Ihre eigene Frage sagte), die Sie dann verwenden können, wie eine zusätzliche Spalte auf der wählen Sie die können Sie dann Sortieren.
So, Sie explizit zu beschreiben, die Bestellung, die Sie wünschen in der Datenbank, wo es sein sollte.
InformationsquelleAutor Paul Sonier
sans-SEQUENZ, funktioniert nur auf 8.4:
InformationsquelleAutor Michael Buen
oder wenn Sie bevorzugen, böse über gut:
InformationsquelleAutor Hafthor
Ich Stimme mit allen anderen Postern, die sagen, "Mach das nicht" oder "SQL ist nicht gut". Wenn Sie möchten, zu Sortieren, indem Sie einige Facetten der Kommentare, dann fügen Sie eine weitere integer-Spalte einer Ihrer Tabellen zu halten Ihren Kriterien Sortieren und Sortieren nach diesem Wert. eg ", UM DURCH die Kommentare.Sortieren DESC " Wenn Sie wollen, Sortieren Sie diese in einer anderen Reihenfolge jedes mal dann... SQL ist nicht für Sie, in diesem Fall.
InformationsquelleAutor Trey
Und hier ist eine andere Lösung, die funktioniert und verwendet eine Konstante-Tabelle (http://www.postgresql.org/docs/8.3/interactive/sql-values.html):
Aber wieder ich bin nicht sicher, dass dies performant.
Ich habe ein Bündel von Antworten. Kann ich die Abstimmung und Kommentare, damit ich weiß, das ist der Gewinner!
Danke An Alle 🙂
InformationsquelleAutor nutcracker
[BEARBEITEN]
unnest ist noch nicht gebaut-in 8.3, aber Sie kann man selbst erstellen(die Schönheit jeder*):
diese Funktion kann die Arbeit in jeder Art:
unnest ist noch nicht gebaut-in 8.3, aber Sie implementieren können, ein Sie sich. siehe code oben
InformationsquelleAutor Michael Buen
Leichte Verbesserung gegenüber der version verwendet, die eine Folge denke ich:
InformationsquelleAutor
hier [bbs] ist die zentrale Tabelle, die ein Feld namens ids,
und ids ist das array, das speichern der Kommentare.id .
übergeben postgresql 9.6
natürlich getestet werden in einer postgresql 9.6.
hier, denken Sie daran, die ids ist ein array-Typ, wie, {1,2,3,4}.
InformationsquelleAutor user6161156