PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Repositório - ordenar por na consulta nativa não está funcionando


Se for uma instrução preparada e for um valor de ligação fornecido no ORDER BY cláusula, isso é válido, MAS...

O valor de ligação fornecido não será interpretado como texto SQL. Ou seja, o valor será visto apenas como um valor (como uma string literal). Não será visto como um nome de coluna ou um ASC ou DESC palavra-chave.

No contexto de sua instrução, fornecendo um valor para o :orderClause bind placeholder, isso terá o mesmo efeito como se você tivesse escrito ORDER BY 'some literal' .

E isso não está realmente fazendo nenhuma ordenação das linhas.

(Isso é verdade pelo menos em todas as bibliotecas de cliente SQL que usei com DB2, Teradata, Oracle, SQL Server, MySQL e MariaDB (JDBC, Perl DBI, ODBC, Pro/C, et al.)

(O MyBatis fornece um mecanismo conveniente para fazer a substituição de variáveis ​​no texto SQL, alterando dinamicamente o texto SQL antes de ser preparado, mas essas substituições são tratadas ANTES de a instrução ser preparada e não se transformam em espaços reservados de vinculação na instrução.)

É possível obter um mínimo de ordenação "dinâmica" com algumas expressões cuidadosamente elaboradas na cláusula ORDER BY. Por exemplo, podemos fazer com que nosso texto SQL estático seja algo assim:
  ORDER BY CASE WHEN :sort_param = 'name ASC'  THEN activation_name END ASC
         , CASE WHEN :sort_param = 'name DESC' THEN activation_name END DESC

(O texto SQL aqui não é dinâmico, na verdade é estático, é como se tivéssemos escrito.
 ORDER BY expr1 ASC
        , expr1 DESC

O "truque" é que as expressões na cláusula ORDER BY estão retornando condicionalmente o valor de alguma coluna de cada linha ou estão retornando um literal (no exemplo acima, o literal NULL), dependendo do valor de uma ligação valor, avaliado em tempo de execução.

O efeito líquido é que podemos "dinamicamente" obter o efeito de:
 ORDER BY activation_name ASC, NULL DESC

ou
 ORDER BY NULL ASC, activation_name DESC

ou
 ORDER BY NULL ASC, NULL DESC

dependendo do valor que fornecemos para o espaço reservado :sort_param.