PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Repository - Sortieren nach in der nativen Abfrage funktioniert nicht

Wenn das eine vorbereitete Anweisung ist, und das ist ein Bindungswert, der in ORDER BY bereitgestellt wird Klausel, das ist gültig, ABER...

Der bereitgestellte Bindungswert wird nicht als SQL-Text interpretiert. Das heißt, der Wert wird nur als Wert angesehen (wie eine Literalzeichenfolge). Es wird nicht als Spaltenname oder ASC gesehen oder DESC Schlüsselwort.

Geben Sie im Kontext Ihrer Anweisung einen Wert für :orderClause an Bind-Platzhalter, das wird den gleichen Effekt haben, als ob Sie ORDER BY 'some literal' geschrieben hätten .

Und das ordnet die Zeilen überhaupt nicht wirklich an.

(Dies gilt zumindest für jede SQL-Clientbibliothek, die ich mit DB2, Teradata, Oracle, SQL Server, MySQL und MariaDB (JDBC, Perl DBI, ODBC, Pro/C usw.) verwendet habe.

(MyBatis bietet einen bequemen Mechanismus zum Ersetzen von Variablen innerhalb des SQL-Texts, indem der SQL-Text dynamisch geändert wird, bevor er vorbereitet wird, aber diese Ersetzungen werden behandelt, BEVOR die Anweisung vorbereitet wird, und werden nicht zu Platzhaltern in der Anweisung.)

Es ist möglich, mit einigen sorgfältig ausgearbeiteten Ausdrücken in der ORDER BY-Klausel ein gewisses Maß an "dynamischer" Ordnung zu erreichen. Unser statischer SQL-Text könnte beispielsweise so aussehen:

  ORDER BY CASE WHEN :sort_param = 'name ASC'  THEN activation_name END ASC
         , CASE WHEN :sort_param = 'name DESC' THEN activation_name END DESC

(Der SQL-Text hier ist nicht dynamisch, er ist tatsächlich statisch, es ist, als ob wir geschrieben hätten.

 ORDER BY expr1 ASC
        , expr1 DESC

Der „Trick“ besteht darin, dass die Ausdrücke in der ORDER BY-Klausel bedingt entweder den Wert einer Spalte aus jeder Zeile oder ein Literal (im obigen Beispiel das Literal NULL) zurückgeben, abhängig vom Wert einer Bindung Wert, der zur Ausführungszeit ausgewertet wird.

Der Nettoeffekt ist, dass wir den Effekt von beiden "dynamisch" erhalten können:

 ORDER BY activation_name ASC, NULL DESC

oder

 ORDER BY NULL ASC, activation_name DESC

oder

 ORDER BY NULL ASC, NULL DESC

abhängig davon, welchen Wert wir für den Platzhalter :sort_param angeben.