PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Хранилище - подреждане по в родната заявка не работи

Ако това е подготвен израз и това е стойност за обвързване, която се предоставя в ORDER BY клауза, това е валидно, НО...

Предоставената стойност на свързване няма да се интерпретира като SQL текст. Тоест стойността ще се разглежда просто като стойност (като литерал низ). Няма да се вижда като име на колона или ASC или DESC ключова дума.

В контекста на вашето изявление предоставяне на стойност за :orderClause bind placeholder, това ще има същия ефект, както ако сте написали ORDER BY 'some literal' .

И това всъщност изобщо не прави никакво подреждане на редовете.

(Това е вярно поне във всяка SQL клиентска библиотека, която съм използвал с DB2, Teradata, Oracle, SQL Server, MySQL и MariaDB (JDBC, Perl DBI, ODBC, Pro/C и др.)

(MyBatis предоставя удобен механизъм за извършване на заместване на променлива в SQL текста, като динамично променя SQL текста, преди да бъде подготвен, но тези замествания се обработват ПРЕДИ операторът да бъде подготвен и не се превръщат в контейнери за свързване в оператора.)

Възможно е да получите малко "динамично" подреждане с някои внимателно изработени изрази в клаузата ORDER BY. Например, можем да направим нашия статичен SQL текст нещо подобно:

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

(Тук SQL текстът не е динамичен, всъщност е статичен, все едно сме го написали.

 ORDER BY expr1 ASC
        , expr1 DESC

„Номерът“ е, че изразите в клаузата ORDER BY условно връщат или стойността на някаква колона от всеки ред, или връщат литерал (в примера по-горе, литерала NULL), в зависимост от стойността на свързване стойност, оценена по време на изпълнение.

Нетният ефект е, че можем "динамично" да получим ефекта от едно от двете:

 ORDER BY activation_name ASC, NULL DESC

или

 ORDER BY NULL ASC, activation_name DESC

или

 ORDER BY NULL ASC, NULL DESC

в зависимост от това каква стойност предоставяме за контейнера :sort_param.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да попреча на PostgreSQL да променя моите добре форматирани SQL дефиниции

  2. Индексът gin_trgm_ops на Postgres не се използва

  3. разделяне на редове в Redshift

  4. Runtime.getRuntime().exec за предаване на параметър, когато бъдете подканени

  5. Как да осредните резултатите от рецензията на продукта с помощта на activerecord и POSTGRES