Help us understand the problem. What is going on with this article?

Order byにバインド変数は使えない

More than 1 year has passed since last update.

Order byにバインド変数は使えない

tl; dr

  • order by ? というようなバインド変数の使い方は誤り
  • order by句の中身を動的に切り替えたい場合は、値を検証した上で文字列結合する

概要

order by句でバインド変数を利用した場合、特にエラーは発生しませんが内容は無視されてしまいます。

そもそも、バインド変数は何のために利用するのか?

一般にバインド変数のメリットは以下の二つです。

  1. SQLインジェクションを防ぐ
  2. パフォーマンスを高める

今回、問題になるのは2の「パフォーマンスを高める」の方です。
バインド変数は、パラメータだけ異なるSQLをDBMSに同一のSQLと認識させることで、
実行計画の再計算を抑制したり、キャッシュの共用を可能にしたりすることでパフォーマンスを高めるものです。
つまり、内部的に同じSQLではないと意味がありません。

カラム自体の切り替えは実行計画を激変させる

where句の中で比較する値をパラメータで切り替える場合は、同じ実行計画で処理することが可能ですし、
前回実行時の結果キャッシュを流用することが可能なケースも多くあります。
一方で、Order byのようにカラム自体の指定が異なる場合は実行計画自体(とそれにより決定される内部処理)が大きく異なってしまうためそれらの流用が出来ません。

このため、カラム自体に対してバインド変数を指定することは出来ません。

動的にソートを切り替えたい場合はどうすればいいか?

前述の通りバインド変数は使えないので、手動でORDER BY句を組み立てる必要があります。

ただ、バインド変数を利用しなくなったことにより、バインド変数のもう一つのメリット「SQLインジェクションを防ぐ」の部分も失われてしまっています。
こちらについても手動で保証する必要があります。渡されてくる値が正当なカラム名であることを検証した上で組み立てるようにしましょう。

xx2xyyy
技術チーム新設に伴い、新人CTOになりました。 日々修行中です。
english-bootcamp
2日20時間の超短期集中英会話スクールを運営。Webやアプリへの展開も計画中です。
https://english-bootcamp.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away