« Playlist: Vocaloids 2012.02 | ホーム | SWF-ForcibleConverter »

2012年3月11日

order by で大文字小文字を無視する

DBIx::Skinny と SQLite3 との組み合わせでの話。DBIx::Skinny で ORDER BY をかけたいときは、次のように( resultset を使う場合):

$rs->order({ column => 'column', desc => 'asc' });

大文字小文字を区別しないでいいのにな、と思って SQLite のドキュメントを見てみたら、 collate type を指示するとのことで、これについては DBD::SQLite にも言及があった。

$rs->order({ column => 'column', desc => 'collate nocase asc' });

ASC (DESC) の前に書くのがポイントかな。最初うしろに書いて結果が得られずに悩んでしまった。

さて、 resultset は DBIx::Skinny::SQL のメソッド as_aggregate に行き着き、クエリーとして組み立てられる。その部分を引用すると、このようになっている。 $elements は order にセットしたハッシュ:

sub as_aggregate {
    ...
    ...
    return uc($set)
           . ' BY '
           . join(', ', map { $_->{column} . ($_->{desc} ? (' ' . $_->{desc}) : '') } @$elements)
           . "\n";
}

つまり何が言いたいかというと、この実装が変わったりすると駄目になるリスクがある。

DBIx::Skinny は生の SQL を書くシーンを想定している設計思想なので、こんなところに注目しないで、潔く生の SQL を書いて使った方がいいのかもしれない。

コメントする

OpenID対応しています OpenIDについて

このブログ記事について

このページは、hiroakiが2012年3月11日 22:53に書いたブログ記事です。

ひとつ前のブログ記事は「Playlist: Vocaloids 2012.02」です。

次のブログ記事は「SWF-ForcibleConverter」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。