部分文字列が取得したくなったらテーブル設計を疑え
絶対の指針ではないけど、部分文字列が取得したいと言うことは、ひとつのカラム内に複数の独立したデータが存在する可能性がある*1。
例えば以下のわかりやすい例。
tableはweatherテーブルとし、
MySQLにおける正規表現
id:int
content:char
正規表現抽出内容[曇時々雪 - 最高気温-2℃ (木)]
の文字列のうち[-2]を抽出
この場合、contentに何もかもを詰め込んでいるため、欲しいデータが単純なSQLで取得するのが難しくなっている。
テーブル設計を見直し、
name | type |
---|---|
id | int |
weather | char |
max_temp | int |
day_of_week | enum |
とでもしておけば、最高気温を取得するSQLは
SELECT max_temp FROM Weathers
で、
ちなみに、登録者のuserテーブルに格納されているカラム(利用者設定温度)と比較し、設定温度>正規表現結果のuser情報だけを表示したいのですが、できますでしょうか?(正規表現と関数計算の応用?)
MySQLにおける正規表現
userテーブルは
id:int
temperature(設定温度):int
これを実現するSQLはJOINするなりEXISTS使うなり、どうとでも書ける。
また、1カラム内に複数のデータを詰め込んでいる場合は*3、カラムを分割するのではなく行方向に分割する。
例えばこんな場合。
id | content |
---|---|
1 | 1,2,5 |
2 | 3,5 |
これは、
id | content |
---|---|
1 | 1 |
1 | 2 |
1 | 5 |
2 | 3 |
2 | 5 |
こう分割する。
ちなみに、経路列挙モデルは部分文字列をうまく使っている好例であり、部分文字列の取得が即だめな設計であるというわけではないので注意。