Ok, ich habe eine Tabelle mit einem indizierten Schlüssel und einem nicht indizierten Feld. Ich muss alle Datensätze mit einem bestimmten Wert finden und die Zeile zurückgeben. Ich würde gerne wissen, ob ich nach mehreren Werten bestellen kann.
Beispiel:
id x_field
-- -----
123 a
124 a
125 a
126 b
127 f
128 b
129 a
130 x
131 x
132 b
133 p
134 p
135 i
pseudo: möchte, dass die Ergebnisse so geordnet werden, where ORDER BY x_field = 'f', 'p', 'i', 'a'
SELECT *
FROM table
WHERE id NOT IN (126)
ORDER BY x_field 'f', 'p', 'i', 'a'
Das Ergebnis wäre also:
id x_field
-- -----
127 f
133 p
134 p
135 i
123 a
124 a
125 a
129 a
Die Syntax ist gültig, aber wenn ich die Abfrage ausführe, werden keine Ergebnisse zurückgegeben, selbst wenn ich sie auf 1 Datensatz beschränke. Gibt es einen anderen Weg, dies zu tun?
Stellen Sie sich das x_field als Testergebnis vor und ich muss alle Datensätze validieren, die in den Zustand fallen. Ich wollte die Testergebnisse nach fehlgeschlagenen Werten und übergebenen Werten ordnen. So konnte ich zuerst die fehlgeschlagenen Werte und dann die übergebenen Werte mit ORDER BY validieren.
Was ich nicht kann:
- GROUP BY, da ich die spezifischen Datensatzwerte zurückgeben muss
- WO x_field IN ('f', 'p', 'i', 'a'), ich benötige alle Werte, da ich versuche, eine Abfrage für mehrere Validierungstests zu verwenden. Und x_field-Werte sind nicht in DESC / ASC-Reihenfolge
Nachdem ich diese Frage geschrieben habe, denke ich, dass ich das überdenken muss, LOL!
quelle
Antworten:
quelle
Sie können einen LEFT JOIN mit "VALUES ('f', 1), ('p', 2), ('a', 3), ('i', 4)" verwenden und die zweite Spalte in Ihrer Reihenfolge verwenden -durch Ausdruck. Postgres verwendet einen Hash-Join, der viel schneller ist als ein riesiger CASE, wenn Sie viele Werte haben. Und es ist einfacher, automatisch zu generieren.
Wenn diese Bestellinformationen festgelegt sind, sollte sie eine eigene Tabelle haben.
quelle
Versuchen:
Sie waren auf dem richtigen Weg, aber indem Sie x_field nur auf den F-Wert setzen, wurden die anderen 3 als Konstanten behandelt und nicht mit irgendetwas im Datensatz verglichen.
quelle
Verwenden Sie einen
case
Schalter, um die Codes in Zahlen zu übersetzen, die sortiert werden können:quelle
Ich habe dafür eine viel sauberere Lösung gefunden:
Hinweis: array_position benötigt Postgres v9.5 oder höher.
quelle
array_position(ARRAY[1, 0]::integer[], x_field)
Die
CASE
undORDER BY
Vorschläge sollten alle funktionieren, aber ich werde ein Pferd einer anderen Farbe vorschlagen. Angenommen, es gibt nur eine angemessene Anzahl von Werten fürx_field
und Sie wissen bereits, um welche es sich handelt, erstellen Sie einen Aufzählungstyp mit F, P, A und I als Werten (zuzüglich aller anderen möglichen Werte). Aufzählungen werden in der Reihenfolge sortiert, in der sie angegeben sindCREATE
. Sie können auch aussagekräftige Wertnamen verwenden - Ihre reale Anwendung tut dies wahrscheinlich und Sie haben sie nur aus Gründen der Vertraulichkeit maskiert -, ohne Speicherplatz zu verschwenden, da nur die Ordnungsposition gespeichert wird.quelle
Sie können nach einer ausgewählten Spalte oder anderen Ausdrücken sortieren.
Hier ein Beispiel, wie man nach dem Ergebnis einer case-Anweisung ordnet:
Das Ergebnis ist eine Liste, die mit den Zeilen "IsGen = 0" beginnt, gefolgt von den Zeilen "IsGen = 1" und allen anderen Zeilen am Ende.
Sie können am Ende weitere Bestellparameter hinzufügen:
quelle
Für jemanden, der neu bei ORDER BY with CASE ist, kann dies nützlich sein
quelle
Sie können die Position (Text in Text) verwenden, um die Reihenfolge zu bestimmen
quelle