sql >> データベース >  >> RDS >> PostgreSQL

リポジトリ-ネイティブクエリでの順序付けが機能しない

    それがプリペアドステートメントであり、それがORDER BYで提供されているバインド値である場合 条項、それは有効ですが...

    指定されたバインド値はSQLテキストとして解釈されません。つまり、値は(リテラル文字列のような)単なる値として表示されます。列名またはASCとしては表示されません またはDESC キーワード。

    ステートメントのコンテキストで、:orderClauseの値を指定します プレースホルダーをバインドします。これは、ORDER BY 'some literal'を記述した場合と同じ効果があります。 。

    そして、それは実際には行の順序付けをまったく行っていません。

    (これは、少なくともDB2、Teradata、Oracle、SQL Server、MySQL、およびMariaDB(JDBC、Perl DBI、ODBC、Pro / Cなど)で使用したすべてのSQLクライアントライブラリに当てはまります。

    (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. MySQL:日付範囲を新しい行に拡張

    2. where句があってもSELECTCOUNT(*)は遅い

    3. Play Frameworkを使用してSSL経由でリモートMySQLデータベースに接続するにはどうすればよいですか?

    4. SQLでの出現に番号を付ける方法