2005-02-19
@ [ruby] Pure RubyのMySQL, PostgreSQLドライバ
Rubyのデータベースドライバってずっと拡張ライブラリしかないものだと思ってたのですが、るびまを見て、Pure Rubyで実装されたRuby/MySQLとpostgres-prがあることを知りました。拡張ライブラリだと「Windowsでも動くんかいな?」ということを心配していたのですが、これでそんな心配は無用ですね。
2008-02-19
@ [mysql] MySQLの便利なフロー制御関数
あんまり知られていなさそうなMySQLの便利な関数があるので、ちょこっと紹介してみます。詳しくはMySQL本家のマニュアルを見てもらいたいのですが、以下簡単に説明。
- IF(expr1,expr2,expr3)
-
SQLで条件分岐を行いたい場合、普通は
CASE WHEN 条件 THEN 真の場合 ELSE 偽の場合 END;
みたいな書き方がSQL標準ですが、MySQLではこれをもっと簡潔に書けるIFという関数があります。
IF(expr1,expr2,expr3)
マニュアルそのままですが「expr1 が TRUE(expr1 <> 0 および expr1 <> NULL)の場合 IF() は expr2 を返し、それ以外の場合は expr3 を返す。」という仕様です。例えば
SELECT IF(1 = 1,"true","false");
というSQLは "true" を返します。CASE文の場合記述量が多いのでSQLとしては非常に見にくくなってしまうというデメリットがありますが、このIFの場合カンマで区切るだけなのですっきりしていて見易いです。
- IFNULL(expr1,expr2)
こちらは「expr1 が NULL でない場合は expr1 を返し、それ以外の場合は expr2 を返す。」という関数です。この関数の使いどころは、NULL値がっ入っているかもしれないカラムに対して演算を行う場合です。
mysql> select * from test; +------------+--------+ | date | charge | +------------+--------+ | 2008-01-01 | NULL | | 2008-01-02 | 1000 | | 2008-01-03 | 2000 | +------------+--------+
というデータがあるとして、
select charge / 100 from test;
というSQLを実行すると
+--------------+ | charge / 100 | +--------------+ | NULL | | 10.0000 | | 20.0000 | +--------------+
のように1行目はNULLになってしまいますが、IFNULLを使って
mysql> select IFNULL(charge, 0) / 100 from test; +-------------------------+ | IFNULL(charge, 0) / 100 | +-------------------------+ | 0.0000 | | 10.0000 | | 20.0000 | +-------------------------+
のように、chargeの値をNULLではなくゼロとして計算させることができます。
- COALESCE(list)
IFNULLと非常に似た関数として、SQL標準のCOALESCEというものもあります。これは引数のリストの中で最初の非NULL値を返す関数で、可変個の引数を受け付けます。例えば
SELECT COALESCE(NULL, NULL, 1);
の実行結果は 1 になります。IFNULLが2つの引数しか取らないのに対して、こちらは任意の個数の引数を渡せるというメリットがあります。あと、SQL標準なのでMySQL以外でも使えます。
SQLはかれこれ5年ぐらい使っているのですが、DB依存の関数や仕組みに関してはまだまだ勉強するところはたくさんありそうです。
# まこと [どんなの聞くんですか?]
# おいぬめ [KORN, RATMなどのヘビィ・ロックでしょうか...]
# まこと [あー、最近のだなあ。Kula Shakerとかがわたしの一番最新かも。。。]
# おいぬめ [Kula Shakerが最新? 他にはどんなの聴くんですか?]
# まこと [私の守備範囲は、HR/HM、パンク、ブルーズあたりですねえ。ギター弾きだったりするのでどうしても。]
# おいぬめ [んー、HR/HMは昔ちょろっと聞いたぐらいですねぇ。パンクってNoFXとかRancidですか?]