DECODE
何年にもわたって複数の人が改修をしてきたSQLを修正するときに
思いもよらぬ罠があったので備忘として残します。
PL/SQLには複数の条件分岐が存在します。
IF、CASE、DECODE
その中でも特にDECODEはしれっと紛れていることが多く
組み込まれると一瞬立ち止まる内容でもあります。
DECODEの意味合いとしては
SELECT
DECODE(TEST, 条件1 , 結果1 , 条件2 , 結果2 ,結果3(ELSE))
FROM
TABLE;
としたとき
TABLEに存在するTESTというカラムの内容に対して
条件1の場合結果1を
条件2の場合結果2を
それ以外の場合結果3を
値として返すという条件分岐式になっています。
テーブルとカラムをシンプルに置き換えるだけの改修だと思っていた私は
置換でシンプルにしたところ、このDECODEの部分をいじってしまったため
約2時間答えを求めてテスト用にSQLを動かすバッチをたたく羽目になりました。
条件絞
DBの改修などをするときに覚えておきたいのが
件数を絞ること
JAVAとは異なり、SQL関連は一度DBにアクセスすると
処理に時間がかかりがちです。
特に新規で作成したDBなどは構成がごちゃっとしていてレスポンスが悪いこともしばしば
そこで条件を絞らないと痛い目を見るわけです。
例えばMySQLならLIMIT句があり以下のように絞ることができます
SELECT 列名 FROM テーブル名 LIMIT 10
今回の場合だと1件目から10件目までを取得するようになっています。
補足ですが、OFFSET句を使うと何件目までを除外しての出力が可能であり、
LIMIT 10 OFFSET 100
とすると、1~100件目を除外し、101件目から10件の取得をしてくれます。
(私はあまり使いませんが)
Oracleの場合は少し癖があり、
ROWNUMを使ってあげます
WHERE句内に入れることで件数の絞り込みが可能です。
SELECT 列名 FROM テーブル名 WHERE ROWNUM <= 5
この場合だと5件目までの取得を行います。
ROWNUMは的確に何年目を絞り込むことなどもできるため、デバッグにも使えますし、動作を確認したいときにとりあえず件数を絞りあとでまとめて条件文を削除したりしています。
思いのほか改修に時間がかかる場合、
何かしらの独特なSQLが紛れ込んでいる場合があるため、
SQLを一度流れに沿って読むのは大事だと実感した次第です。