Red > Green > Refactor > Red

cycle is based on desire

FIND_IN_SET ; MySQL

目的

  1. FIND_IN_SET の 使い方を知ること

1-0. FIND_IN_SET / 単一コマンド

1-1. テーブルを使ったコマンド

  • MySQL 独自関数らしいので、各々の RDBMS では都度調査が必要。

FIND_IN_SET / 単一コマンド

公式ドキュメントより

FIND_IN_SET(str,strlist)

N 個の部分文字列で構成されるリスト strlist に、文字列 str が含まれている場合は、1 から N までのいずれかの値を返す。文字列のリストは、それぞれの間を ‘,’ 文字で区切られた各部分文字列で構成される文字列である。最初の引数が定数文字列で、2 番目の引数が SET 型のカラムの場合、FIND_IN_SET() 関数はビット演算を使用するよう最適化される。 str が strlist に含まれていない場合や、strlist が空の文字列の場合は、0 を返す。どちらの引数も NULL の場合は、NULL を返す。 最初の引数にカンマ ‘,’ が含まれていると、この関数は正しく動作しない。 <

mysql> SELECT FIND_IN_SET('X', 'a,X,a,a');
+-----------------------------+
| FIND_IN_SET('X', 'a,X,a,a') |
+-----------------------------+
|                           2 |
+-----------------------------+
1 row in set (0.00 sec)
mysql> SELECT FIND_IN_SET('X', 'a,a,a,a,X,a');
+---------------------------------+
| FIND_IN_SET('X', 'a,a,a,a,X,a') |
+---------------------------------+
|                               5 |
+---------------------------------+
mysql> SELECT FIND_IN_SET('X', 'a,a,a');
+---------------------------+
| FIND_IN_SET('X', 'a,a,a') |
+---------------------------+
|                         0 |
+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT FIND_IN_SET(NULL, NULL);
+-------------------------+
| FIND_IN_SET(NULL, NULL) |
+-------------------------+
|                    NULL |
+-------------------------+
1 row in set (0.00 sec)

テーブルを使ったコマンド

次の 2 テーブルを用意する

program

program_id program_name
1 C
2 Java
3 Ruby
4 PHP
5 objC

member

member_id member_name program_ids
1 'Hirano' '1,5'
2 'Kawabe' '1,2'
3 'Miyata' '3,4'
4 'Tsuruno' '2,3,4'

C が使える人を探したい

mysql> SELECT * FROM member WHERE FIND_IN_SET(1, program_ids);
+-----------+-------------+-------------+
| member_id | member_name | program_ids |
+-----------+-------------+-------------+
|         1 | Hirano      | 1,5         |
|         2 | Kawabe      | 1,2         |
+-----------+-------------+-------------+
2 rows in set (0.00 sec)

Java が使える人を探したい

mysql> SELECT * FROM member WHERE FIND_IN_SET(2, program_ids);
+-----------+-------------+-------------+
| member_id | member_name | program_ids |
+-----------+-------------+-------------+
|         2 | Kawabe      | 1,2         |
|         4 | Tsuruno     | 2,3,4       |
+-----------+-------------+-------------+
2 rows in set (0.00 sec)

テーブル用意までのソースコード

CREATE TABLE program (
program_id   INT       NOT NULL AUTO_INCREMENT PRIMARY KEY,
program_name char(255) NOT NULL
);

CREATE TABLE member (
member_id   INT       NOT NULL AUTO_INCREMENT PRIMARY KEY,
member_name char(255) NOT NULL,
program_ids char(255) NOT NULL
);


INSERT INTO program (program_name) VALUES
('C'), ('Java'), ('Ruby'), ('PHP'), ('objC');

INSERT INTO member (member_name, program_ids) VALUES
('Hirano', '1,5'), ('Kawabe', '1,2'), ('Miyata', '3,4'), ('Tsuruno', '2,3,4');

引用元

公式ドキュメント # FIND_IN_SET 日本語リファレンスは4系のみ

イノベートな非日常 FIND_IN_SET テーブル操作とソースコード # 勉強になりました