PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Repository:l'ordine per nella query nativa non funziona

Se si tratta di un'istruzione preparata e si tratta di un valore di collegamento fornito in ORDER BY clausola, che è valida, MA...

Il valore di collegamento fornito non verrà interpretato come testo SQL. Cioè, il valore sarà visto solo come un valore (come una stringa letterale). Non verrà visualizzato come un nome di colonna o un ASC o DESC parola chiave.

Nel contesto della tua istruzione, fornendo un valore per :orderClause bind placeholder, avrà lo stesso effetto come se avessi scritto ORDER BY 'some literal' .

E questo non sta affatto ordinando le righe.

(Questo è vero almeno in ogni libreria client SQL che ho usato con DB2, Teradata, Oracle, SQL Server, MySQL e MariaDB (JDBC, Perl DBI, ODBC, Pro/C, et al.)

(MyBatis fornisce un comodo meccanismo per eseguire la sostituzione di variabili all'interno del testo SQL, modificando dinamicamente il testo SQL prima che venga preparato, ma tali sostituzioni vengono gestite PRIMA che l'istruzione sia preparata e non si trasformano in segnaposto di binding nell'istruzione.)

È possibile ottenere un minimo di ordinamento "dinamico" con alcune espressioni accuratamente predisposte nella clausola ORDER BY. Ad esempio, possiamo fare in modo che il nostro testo SQL statico sia qualcosa del genere:

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

(Il testo SQL qui non è dinamico, in realtà è statico, è come se lo avessimo scritto.

 ORDER BY expr1 ASC
        , expr1 DESC

Il "trucco" è che le espressioni nella clausola ORDER BY restituiscono condizionatamente il valore di una colonna da ogni riga, oppure restituiscono un valore letterale (nell'esempio sopra, il valore letterale NULL), a seconda del valore di un'associazione valore, valutato al momento dell'esecuzione.

L'effetto netto è che possiamo ottenere "dinamicamente" l'effetto di:

 ORDER BY activation_name ASC, NULL DESC

o

 ORDER BY NULL ASC, activation_name DESC

o

 ORDER BY NULL ASC, NULL DESC

a seconda del valore fornito per il segnaposto :sort_param.