sql >> Databáze >  >> RDS >> PostgreSQL

Úložiště - řazení podle v nativním dotazu nefunguje

Pokud se jedná o připravený příkaz a je to hodnota vazby, která je uvedena v ORDER BY klauzule, která je platná, ALE...

Zadaná hodnota vazby nebude interpretována jako text SQL. To znamená, že hodnota bude považována pouze za hodnotu (jako doslovný řetězec). Nebude to vidět jako název sloupce nebo ASC nebo DESC klíčové slovo.

V kontextu vašeho příkazu zadejte hodnotu pro :orderClause bind zástupný symbol, bude to mít stejný účinek, jako kdybyste napsali ORDER BY 'some literal' .

A to ve skutečnosti vůbec neprovádí žádné řazení řádků.

(To platí přinejmenším pro všechny klientské knihovny SQL, které jsem použil s DB2, Teradata, Oracle, SQL Server, MySQL a MariaDB (JDBC, Perl DBI, ODBC, Pro/C a další.)

(MyBatis poskytuje pohodlný mechanismus pro provádění substituce proměnných v textu SQL, dynamicky mění text SQL předtím, než je připraven, ale tyto substituce jsou zpracovány PŘED přípravou příkazu a v příkazu se nestávají zástupnými symboly vazby.)

Je možné získat trochu "dynamického" řazení pomocí pečlivě vytvořených výrazů v klauzuli ORDER BY. Například můžeme mít náš statický text SQL něco takového:

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

(Text SQL zde není dynamický, je ve skutečnosti statický, je to, jako bychom psali.

 ORDER BY expr1 ASC
        , expr1 DESC

"Trik" je v tom, že výrazy v klauzuli ORDER BY podmíněně vracejí buď hodnotu nějakého sloupce z každého řádku, nebo vracejí literál (ve výše uvedeném příkladu literál NULL), v závislosti na hodnotě vazby. hodnota, vyhodnocena v době provádění.

Čistým efektem je, že můžeme „dynamicky“ získat efekt obou:

 ORDER BY activation_name ASC, NULL DESC

nebo

 ORDER BY NULL ASC, activation_name DESC

nebo

 ORDER BY NULL ASC, NULL DESC

podle toho, jakou hodnotu dodáme pro zástupný symbol :sort_param.



  1. Řazení hodnot null po všech ostatních, kromě speciálních

  2. Jak zabránit duplicitnímu vkládání do tabulky

  3. Základní konverze PL/SQL bez funkcí

  4. MySQL odstranění některých cizích klíčů