「データベース」 カテゴリの記事一覧

結合テーブルから集約値と同時に代表値を取得する

2013年04月17日 04時53分

集約関数を使用した結合テーブルの、集約される側のテーブルのフィールド値は、集約関数を通してしか取得することができない。

が、どのフィールドでもいいから集約される側のテーブルの文字列フィールドの値を持ってきたい場合があって、こんな感じで解決した。

5行目のdiary.titleは文字列なわけだけど、max関数に渡すことで集約される側のテーブルから代表値を取得しているような状態。

1人のpersonが「はじめまして」と「今日はいい天気だった」と「今日はぶん殴られた」の3つのdiary.titleを書いていた場合に、このうちの代表値としてdiary_titleは「今日はぶん殴られた」が取得される。

 

max(文字列)は、文字の長さではなくて先頭文字から文字コードを比較して文字コードが大きいものを返すから、「は」と「今」では「今」のほうが文字コードが大きく、「今日はい」と「今日はぶ」では、「い」より「ぶ」のほうが文字コードが大きいからmax(diary.title)では「今日はぶん殴られた」が返る。

逆にmin(diary.title)とすれば、「はじめまして」が返る。

(Postgresqlで確認。他のSQLは未確認。)

 

文字列を集約関数ごしに取得する必要性に迫られるケースって、かなりのレアケースだと思うけど・・

私の場合は上述のようなSQLをビューとして定義して、高度な検索クエリを作成する際に結合して利用した。

SQLのLIKE条件に指定する文字列に含まれる%や_のエスケープ

2012年12月14日 21時31分

SQLで文字列の曖昧検索をする場合はLIKEキーワードを使用する。

sqlite> SELECT NAME FROM PERSON WHERE NAME LIKE '%太郎'
Q太郎
小太郎
鬼太郎
キャベツ四太郎
100%太郎

 

では、「%」の文字そのものを含んだ曖昧検索をしたい場合はどうすればいいか?

→ ESCAPEキーワードを使う。

 

と、いうわけで、今回は、ESCAPEキーワードの使い方について、さらっとご紹介する。

(今回の確認環境として、データベースエンジンはSQLite3を使用したが、MySQL等、他のSQLでも適用可能。)
(さらに…)