PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Référentiel - trier par dans la requête native ne fonctionne pas

S'il s'agit d'une instruction préparée et qu'il s'agit d'une valeur de liaison fournie dans le ORDER BY clause, qui est valide, MAIS...

La valeur de liaison fournie ne sera pas interprétée comme du texte SQL. Autrement dit, la valeur sera considérée comme une simple valeur (comme une chaîne littérale). Il ne sera pas vu comme un nom de colonne ou un ASC ou DESC mot-clé.

Dans le contexte de votre déclaration, fournir une valeur pour le :orderClause bind placeholder, cela aura le même effet que si vous aviez écrit ORDER BY 'some literal' .

Et cela ne fait pas vraiment de tri des lignes.

(Cela est vrai au moins dans toutes les bibliothèques clientes SQL que j'ai utilisées avec DB2, Teradata, Oracle, SQL Server, MySQL et MariaDB (JDBC, Perl DBI, ODBC, Pro/C, et al.)

(MyBatis fournit un mécanisme pratique pour effectuer des substitutions de variables dans le texte SQL, en modifiant dynamiquement le texte SQL avant qu'il ne soit préparé, mais ces substitutions sont gérées AVANT que l'instruction ne soit préparée et ne se transforment pas en espaces réservés de liaison dans l'instruction.)

Il est possible d'obtenir un minimum d'ordre "dynamique" avec des expressions soigneusement conçues dans la clause ORDER BY. Par exemple, nous pouvons avoir notre texte SQL statique comme ceci :

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

(Le texte SQL ici n'est pas dynamique, il est en fait statique, c'est comme si nous avions écrit.

 ORDER BY expr1 ASC
        , expr1 DESC

Le "truc" est que les expressions de la clause ORDER BY renvoient conditionnellement soit la valeur d'une colonne de chaque ligne, soit elles renvoient un littéral (dans l'exemple ci-dessus, le littéral NULL), en fonction de la valeur d'un lien valeur, évaluée au moment de l'exécution.

L'effet net est que nous pouvons "dynamiquement" obtenir l'effet soit :

 ORDER BY activation_name ASC, NULL DESC

ou

 ORDER BY NULL ASC, activation_name DESC

ou

 ORDER BY NULL ASC, NULL DESC

en fonction de la valeur que nous fournissons pour l'espace réservé :sort_param.