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))
分かってしまえば簡単だった。