課題:SQLによる左詰め
SQLを使用して,点在するNULL以外のカラムを左詰めにする方法について解説します.
厳密にいうと左詰めにしているわけではなく,新たなテーブルやカラムを作成しているのですが, この記事では簡単のため左詰めという言葉を使います.
具体的な例で示すと,下記のような空白を含んだテーブルが対象です.
今回使用する技術は下記の2つです.
1. coalesce関数
2. case when式
coalesce関数は,引数で指定したカラムの中で,nullでない最初のカラムを返す関数です.
case when式は,処理対象のカラムと特定のカラムを比較し,処理対象のカラムに入力する値を その比較結果に基づき変えることができる式です.
それでは順に説明していきます.
手順1:第一カラムを左寄せにし,完成させる
まず,第一カラムだけ左寄せにします.これで第一カラムだけは完成です. ただし,このとき,第二カラム以降から第一カラムにコピーされた場合には, これらのカラムのデータは重複してしまうことになります. 下記のソースを実行することで,sample2というテーブルを作成しました.
【ソースコードの例】
————————————————————————–
create table sample2 as select
coalesce(jm.診療日数, jm.診療日数2, jm.診療科,jm.入院日, jm.退院日, jm.点数)
jm.診療日数2,
jm.診療科,
jm.入院日,
jm.退院日,
jm.点数
from sample jm
——————————————————————————-
手順2:コピーによって重複したカラムを削除する
手順1を実行しただけでは,第一カラムにコピーしたカラムが残ったままになっています. 手順2では,下記のコードでそのカラムのデータを消します(nullにします).
case when式では,第二カラム(診療日数2)と第一カラム(診療日数)を比較し,同じであれば 第二カラムをnullを代入しています.それ以降の第三カラム以降も同様です.
【ソースコードの例】
—————————————————————————-
create table sample3 as
select
jm.診療日数,
(case when jm.診療日数2 =jm.診療日数 then null else jm.診療日数2 end),
(case when jm.診療科 =jm.診療日数 then null else jm.診療科 end),
(case when jm.入院日 =jm.診療日数 then null else jm.入院日 end),
(case when jm.退院日 =jm.診療日数 then null else jm.退院日 end),
(case when jm.点数 =jm.診療日数 then null else jm.点数 end),
from sample2 jm
—————————————————————————-
手順3:第二カラムを左詰めにする
手順2では,第一カラムである診療日数と重複しているカラムのデータをnullにすることができました.
手順2でnullにされたカラムは,第二カラムであった可能性もあります.
その場合,第二カラムに値を埋める必要があります
下記のように,第二カラムに対して再度coalesce関数を使うことで達成されます.
【ソースコードの例】
——————————————————————————
create table sample4 as
select
jm.診療日数,
coalesce(jm.診療日数2, jm.診療科,jm.入院日, jm.退院日, jm.点数)
jm.診療科,
jm.入院日,
jm.退院日,
jm.点数
from sample3 jm
——————————————————————————
以上,手順2と手順3をカラムの数だけ繰り返すことで左詰めのテーブルを作ることができます.
とはいいつつ、もっと賢いやり方があると思いますので、思いついた方は是非コメンおねがいします。
コメント