読者です 読者をやめる 読者になる 読者になる

部分文字列が取得したくなったらテーブル設計を疑え

DB

絶対の指針ではないけど、部分文字列が取得したいと言うことは、ひとつのカラム内に複数の独立したデータが存在する可能性がある*1
例えば以下のわかりやすい例。

tableはweatherテーブルとし、
id:int
content:char
正規表現抽出内容[曇時々雪 - 最高気温-2℃ (木)]
の文字列のうち[-2]を抽出

MySQLにおける正規表現

この場合、contentに何もかもを詰め込んでいるため、欲しいデータが単純なSQLで取得するのが難しくなっている。
テーブル設計を見直し、

name type
id int
weather char
max_temp int
day_of_week enum

とでもしておけば、最高気温を取得するSQL

SELECT max_temp FROM Weathers

と、とても単純なSQLで済む*2


で、

ちなみに、登録者のuserテーブルに格納されているカラム(利用者設定温度)と比較し、設定温度>正規表現結果のuser情報だけを表示したいのですが、できますでしょうか?(正規表現と関数計算の応用?)
userテーブルは
id:int
temperature(設定温度):int

MySQLにおける正規表現

これを実現する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

こう分割する。


ちなみに、経路列挙モデルは部分文字列をうまく使っている好例であり、部分文字列の取得が即だめな設計であるというわけではないので注意。

*1:第一正規形を破っている

*2:テーブル名はweatherからWeathersに変更

*3:カンマ区切りをそのままDBに格納しているとか。これは多分一番わかり安い第一正規形違反