SQLレビュー
hiroki.iconやがて静的に解析して警告を出してくれるようなオートレビューを作りたい
実際に実行してみて結果をみてみるというのも実践的
間違えるポイント
時間関係の指定
時間の端数切り捨て
タイムゾーン
table:レビュー観点一覧
観点 説明
Nullを考慮する
除算
コメントの位置
CASTの場所
CASTはTrycastじゃなくて大丈夫か?
フォーマット pre
TD_TIME_RANGE 中でTD_TIME_FORMAT_する必要なし
TD_INTERVALを使えないか TD_SCHEDULED_TIMEが使われるのでそれで問題ないのかは注意が必要
TD_INTERVALの + / - 期間指定で過去を指定するときは-をつけ忘れがち
Filterを使いましょう
Sum(NULL)はNULLになるよ 1レコードしか入ってこない場合はNULLになるかも
不必要な行を選択している
不必要なDistinctを使用していないか
CASE文におけるELSE句がない NULLでokの場合は省略
列別名のASがついている時とついていない時
LIKEで_,%をそのままにする時ESCAPE句
否定は!=を使う <>よりも直感的にわかりやすいから
IFよりCast フラグに変換する時にCoalesce(Cast(~), 0)→1,0のハードコードなくすため
不要なテーブル参照 カラム名だけで行けるならそれで
NOT の後にスペースが欲しい NOTは関数じゃなくてブーリアンを反転する予約語なので
ARBITRARYを疑う
/icons/hr.icon
NULLを考慮する
もしここがNULLになるとどうなるだろうか?と問うてみる
CASTとIFの使い分けとか
CASTだとNULLが入るとNULLダヨ
IFなら拾える
除算
NULLIF
COALESCE(col_a / NULLIF(col_b, 0), 0)
CASTの場所
より上位でCASTすれば下位で何回もCASTしなくて済む
フォーマット
JoinはFrom句下なのでFromよりもネストするように
code:sql
FROM
HOGE h
LEFT JOIN FUGA f
ON h.id = f.id
カンマの位置を行末なのか行頭なのか
TD_TIME_RANGEの中でTD_TIME_FORMATをする必要はない
2,3引数にはunixtimestampを直で渡せる
特定の条件のレコードのみ集約したい→Filter
code:sql
Sum(IF(条件, price, 0)) --書き方1
Sum(price) filter(where 条件) --書き方2
Filterを使う方が明確
SUM(Null)はNull
普通に後続のデータがある場合は問題ないが、仮にNullの1レコードしかない場合はNullになってしまう
0と集約したい場合はCOALESCEを使う
TDversionを指定
code:sql
-- @TD engine_version: 317
指定すると最新エンジンになるのでパフォーマンス改善なる場合もある
重い時はこれもあり
ESCAPE句でエスケープシーケンスを指定する
td_client_id LIKE 'hoge$_provision$_%' ESCAPE '$'
$_でエスケープする時はESCAPEで指定する