2009年8月アーカイブ

MySQLの一つのセルに、「,」(カンマ)を含む文字列があるとき、指定された文字列が、カンマで分割された要素の何番目かを調べるSQLが以下。

----------------------------------------------------------
SELECT FIND_IN_SET( 'Mon', 'Spa,ce,Mon,eky' );
-> 3

SELECT FIND_IN_SET( 'ce', 'Spa,ce,Mon,eky' );
-> 2
----------------------------------------------------------
※第1引数で指定した文字列が、引数STRLISTに含まれる値にマッチすれば、マッチしたリストの位置を返す。
※ STRLISTは、カンマ( , )で分割された文字列。
※引数STRLISTが空文字なら"0"を返す。
※どちらかの引数がNULLならNULLを返す。
※最初の引数にカンマが含まれる場合は、エラーとなる。


ユーザーデータの一つに、飼っているペットの種類とか、興味のある分野などの、複数の要素が含まれる可能性がある場合は、カンマで分割した文字列でVARCHAR型のカラムに入れておけば、この関数でWHERE指定できる。

例)
user_table
+−−−−+−−−−−−−−−−−+
|name  | pet_kind  |
+−−−−+−−−−−−−−−−−+
|Yamada | 2,3,6   |
+−−−−+−−−−−−−−−−−+
|Suzuki | 3,8,12,22 |
+−−−−+−−−−−−−−−−−+
    ・
    ・
    ・

※3番のペットを飼っている人の名前を調べる
-------------------------------------------------------------------------------------------
SELECT name FROM user_table WHERE FIND_IN_SET(3, pet_kind) > 0;
-------------------------------------------------------------------------------------------
結果:山田とスズキどちらもSLECTされる。


最初、MySQLもPHPとかperlみたいに、split的な関数があるんだろうなんて思って、たいして気にもせずデータを投入していたら、私の力では発見できなかった。

やばい!と思って、この関数で、かろうじて分割検索できたけど、カンマで分割していたのはたまたま。
もしカンマ以外の文字列で区切ってたら、とおもうと少しぞっとする。

このアーカイブについて

このページには、2009年8月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2009年6月です。

次のアーカイブは2009年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.22-ja