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