CASE式はいいですね!!

2009 年 3 月 8 日 | カテゴリー: LAMP奮闘記, MySQL

昨年、SQLもスキルアップするぞ〜!!(≧∇≦)bと購入したはいいのですが、ちょっと身の丈に合っていなかった為、一通り流し読みしてお蔵入りにしていた書籍にも載っていたSQLの「CASE式」。この度、改めて取り組んで勉強してみましたが…

これはこれは、何とも便利ですね(= ‘艸’)ムププ

<CASE式の構文>

CASE WHEN (条件) THEN (条件が真の場合) ELSE (条件が真でない場合) END

WHEN 〜 THEN 〜 ELSE 〜の箇所は追加する事が可能だそうです。ニュアンスとしては、PHPやCのif 〜 else文やswitch文のような感じですね。WHEN句の条件によって処理や出力を分岐出来るという事ですから、以下のようなケースで利用出来るのではなかろうか??と考えました。

例えば何かのサービスの会員を管理するテーブルなんかがあったとして、「普通会員」と「VIP会員」みたいな区分けをしていたとします。こういう時、方法の是非はよく分からないのですが、普段は区分け用のカラムをTINYINT型などで設けて、「普通会員=0」、「VIP会員=1」みたいな管理をしています。

memberテーブル
member_name category
うぶんとぅ 1
れっどはっと 0
でびあん 0
ふぇどら 1

激しく簡素化しましたが、こんな感じでしょうか。

で、この場合0と1で管理しているのはあくまでDBの都合であって、参照時などに人間様が知りたいのはあくまで「普通会員」と「VIP会員」ですよね??そこで、出力時にPHP側でcategoryの数値を区分名に変換していたワケです。

こういった場合に上記のCASE式を使えば、SQLの発行時点でデータ変換は完了しているワケで、非常に便利なのでは??と思った次第なのです。

SELECT
    member_name,
    (CASE WHEN category = 0 THEN '普通会員' ELSE 'VIP会員' END) AS category
        FROM member;

ただ、本来こういう処理をどこで行うべきなのかを考えると、やはりHTML出力直前にPHPが担う役割なのか??それともDBで完結出来る処理なのだから、DBに任せるべきなのか??果てしなく疑問は尽きません。単純にENUM型というヤツで規定してしまっても良いように思えますし…(゚ペ)?

などとついでにアレコレ調べていたら、ENUM型はどうやらMySQL独自の型定義らしいですね。今のところMySQL以外は使った事無いですし使う予定も無いのですが、各DB独自の拡張等に手を出すのは、もうちょっと共通の基礎を固めてから!!ですね。

何となくPostgreSQLを入れてみようかな〜、などと思ってみたりして…。

勢いづいてストアドプロシージャにまで手を出したのは良いけれど、CIからCALLするとエラーになってしまう原因が分からずに挫折したのは今回も内緒ですけど!!(*ノノ)キャ

今日はここまでヾ(*’-'*)マタネー♪

コメントはまだありません。