SquerylでORDER BY NULLS FIRST (又はLAST)を実行するには


本記事は、MLで質問して返ってきた内容をまとめただけ。

ORDER BYを指定した時のNULLの扱い

SQLでORDER BYを指定した時、その列にNULLがあった場合、その行はどこに来るのか?デフォルトだと「最小の値」として処理されるんだけど、いくつかのDBMSではNULLS FIRSTあるいはNULLS LAST句を付けることによってその動作を制御することが出来る。

SquerylでNULLS FIRST/LASTを扱うには

以下の様なのを作って、

import org.squeryl.dsl.ast.{FunctionNode, ExpressionNode}
import org.squeryl.internals.StatementWriter

object OrderBy {
  def nullsLast(col: ExpressionNode) = new FunctionNode("", None, Seq(col)) {
    override def doWrite(sw: StatementWriter) = {
      col.write(sw)
      sw.write(" nulls last")
    }
  }

  def nullsFirst(col: ExpressionNode) = new FunctionNode("", None, Seq(col)) {
    override def doWrite(sw: StatementWriter) = {
      col.write(sw)
      sw.write(" nulls first")
    }
  }
}

後は、クエリーを組み立てる所で以下のようにするだけ。

import com.example.OrderBy.nullsLast
// ...
        orderBy(nullsLast(someColumn) desc))

分かってしまえば簡単だった。

コメントを残す

メールアドレスが公開されることはありません。