『失敗から学ぶRDBの正しい歩き方』
読みきった。
ジェイウォークなテーブルを正規表現で抽出する
『失敗から学ぶRDBの正しい歩き方』の「第17章 複雑なクエリ」で出てきたアンチパターンの例。
id | name | child_id |
---|---|---|
1 | hoge | 1,2,3,4 |
2 | fuga | 4,5,6,1 |
3 | foo | 7,11,9 |
一つのカラムにカンマ区切りで複数のデータを格納した、『SQLアンチパターン』で言うところのジェイウォークというアンチパターン。
child_id=1
のデータを検索するのにも、複数のLIKE演算子をOR接続する必要があり大変だよねというのが本題。
そこから逸れるが、正規表現でどのように抽出するんだっけと思ってクエリを考えた。
SELECT * FROM table_name WHERE child_id ~ '(^|,)1(,|$)' ;
合っている自信がなく、正規表現を少し復習しようと思った。
おまけの配列にキャストするパターン。
SELECT * FROM table_name WHERE string_to_array(child_id, ',') @> ARRAY['1']; ;
使う日が来ないといいな。
DISTINCT ON
DISTINCTのON句。初めて知った(標準SQLではない)
Ping-tでOSS-DBの勉強をする
残り1割ほどだけど詳しくない分野なので、公式ドキュメントと並行してやりたい。