sql >> Base de Datos >  >> RDS >> PostgreSQL

Repositorio:ordenar por en la consulta nativa no funciona

Si esa es una declaración preparada, y ese es un valor de vinculación que se proporciona en ORDER BY cláusula, eso es válido, PERO...

El valor de enlace proporcionado no se interpretará como texto SQL. Es decir, el valor se verá simplemente como un valor (como una cadena literal). No se verá como un nombre de columna o un ASC o DESC palabra clave.

En el contexto de su declaración, proporcione un valor para :orderClause enlazar marcador de posición, eso tendrá el mismo efecto que si hubieras escrito ORDER BY 'some literal' .

Y eso no es realmente ordenar las filas en absoluto.

(Esto es cierto al menos en cada biblioteca de cliente SQL que he usado con DB2, Teradata, Oracle, SQL Server, MySQL y MariaDB (JDBC, Perl DBI, ODBC, Pro/C, et al.)

(MyBatis proporciona un mecanismo conveniente para realizar la sustitución de variables dentro del texto SQL, cambiando dinámicamente el texto SQL antes de que se prepare, pero esas sustituciones se manejan ANTES de que se prepare la declaración, y no se convierten en marcadores de posición vinculantes en la declaración).

Es posible obtener un mínimo de orden "dinámico" con algunas expresiones cuidadosamente elaboradas en la cláusula ORDER BY. Por ejemplo, podemos hacer que nuestro texto SQL estático sea algo como esto:

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

(El texto SQL aquí no es dinámico, en realidad es estático, es como si lo hubiéramos escrito.

 ORDER BY expr1 ASC
        , expr1 DESC

El "truco" es que las expresiones en la cláusula ORDER BY devuelven condicionalmente el valor de alguna columna de cada fila, o devuelven un literal (en el ejemplo anterior, el literal NULL), dependiendo del valor de un enlace valor, evaluado en tiempo de ejecución.

El efecto neto es que podemos obtener "dinámicamente" el efecto de:

 ORDER BY activation_name ASC, NULL DESC

o

 ORDER BY NULL ASC, activation_name DESC

o

 ORDER BY NULL ASC, NULL DESC

dependiendo del valor que proporcionemos para el marcador de posición :sort_param.