それがプリペアドステートメントであり、それが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プレースホルダーに指定する値によって異なります。