sql >> Database >  >> RDS >> PostgreSQL

Repository - bestellen op in native query werkt niet

Als dat een voorbereide instructie is, en dat is een bindwaarde die wordt opgegeven in de ORDER BY clausule, dat is geldig, MAAR...

De opgegeven bindwaarde wordt niet geïnterpreteerd als SQL-tekst. Dat wil zeggen, de waarde wordt gezien als slechts een waarde (zoals een letterlijke tekenreeks). Het wordt niet gezien als een kolomnaam of een ASC of DESC zoekwoord.

In de context van uw verklaring, een waarde opgeven voor de :orderClause bind placeholder, dat heeft hetzelfde effect als wanneer je ORDER BY 'some literal' had geschreven .

En dat is helemaal niet het ordenen van de rijen.

(Dit geldt in ieder geval in elke SQL-clientbibliotheek die ik heb gebruikt met DB2, Teradata, Oracle, SQL Server, MySQL en MariaDB (JDBC, Perl DBI, ODBC, Pro/C, et al.)

(MyBatis biedt een handig mechanisme voor het vervangen van variabelen binnen de SQL-tekst, waarbij de SQL-tekst dynamisch wordt gewijzigd voordat deze wordt voorbereid, maar die vervangingen worden afgehandeld VOORDAT de instructie wordt voorbereid, en veranderen niet in tijdelijke aanduidingen voor binden in de instructie.)

Het is mogelijk om een ​​beetje "dynamische" ordening te krijgen met enkele zorgvuldig ontworpen uitdrukkingen in de ORDER BY-clausule. We kunnen onze statische SQL-tekst bijvoorbeeld als volgt hebben:

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

(De SQL-tekst hier is niet dynamisch, het is eigenlijk statisch, het is alsof we het hebben geschreven.

 ORDER BY expr1 ASC
        , expr1 DESC

De "truc" is dat de expressies in de ORDER BY-component voorwaardelijk de waarde van een kolom uit elke rij retourneren, of dat ze een letterlijke waarde retourneren (in het bovenstaande voorbeeld de letterlijke NULL), afhankelijk van de waarde van een binding waarde, geëvalueerd op uitvoeringstijd.

Het netto-effect is dat we "dynamisch" het effect kunnen krijgen van:

 ORDER BY activation_name ASC, NULL DESC

of

 ORDER BY NULL ASC, activation_name DESC

of

 ORDER BY NULL ASC, NULL DESC

afhankelijk van de waarde die we leveren voor de :sort_param placeholder.



  1. SQL-syntaxis voor updatequery met connect by prior

  2. Is mysql_insert_id veilig om te gebruiken?

  3. Hoe krijg ik het resultaat van twee select-statements in een enkele rij?

  4. Oracle SQL Developer:hoe de resultaten van een ref-cursor bekijken?