MySQLでカラム内に特定の国コードが存在するか確認する方法(FIND_IN_SET活用)
はじめに
MySQLでは、1つのカラムにカンマ区切りで複数の国コードが保存されているケースがあります。このような場合、「特定の国コードがそのセル(レコード)内に存在するかどうか」を調べるには FIND_IN_SET() 関数を使用するのが便利です。本記事では、実際のSQL例とともにその使い方を解説します。
サンプルテーブルの作成
まず、テーブルを作成します。
mysql> create table DemoTable1439
-> (
-> CountryId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CountryCode varchar(20)
-> );
Query OK, 0 rows affected (0.49 sec)
テストデータの挿入
INSERT文を使って、カンマ区切りの国コードを含むレコードをいくつか追加します。
mysql> insert into DemoTable1439(CountryCode) values('1022_US,7894_UK');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1439(CountryCode) values('6567_AUS,7894_UK');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1439(CountryCode) values('6567_AUS');
Query OK, 1 row affected (0.09 sec)登録内容の確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1439;
実行結果は以下のとおりです。
+-----------+------------------+
| CountryId | CountryCode |
+-----------+------------------+
| 1 | 1022_US,7894_UK |
| 2 | 6567_AUS,7894_UK |
| 3 | 6567_AUS |
+-----------+------------------+
3 rows in set (0.00 sec)
FIND_IN_SET()で特定の国コードを検索する
ここで、「6567_AUS」という国コードがCountryCodeカラム内に存在するレコードだけを抽出したい場合、次のようなクエリを実行します。
mysql> select * from DemoTable1439
-> where find_in_set('6567_AUS',CountryCode) > 0;
実行結果は以下のとおりです。
+-----------+------------------+
| CountryId | CountryCode |
+-----------+------------------+
| 2 | 6567_AUS,7894_UK |
| 3 | 6567_AUS |
+-----------+------------------+
2 rows in set (0.00 sec)
カンマ区切りのリスト内に該当する国コードを持つ2件のレコードが正しく取得できました。
FIND_IN_SET()の仕組み
FIND_IN_SET(検索文字列, 対象文字列) は、対象文字列をカンマで区切ったリストの中に検索文字列が含まれていれば、その位置(1始まりの数値)を返します。見つからなかった場合は0を返すため、「> 0」という条件を付けることで存在チェックが可能になります。
利用時の注意点
FIND_IN_SET()は完全一致で評価されるため、LIKE '%6567_AUS%' のような部分一致検索とは異なり、意図しない誤マッチを防ぐことができます。ただし、カンマ区切りで値を1つのカラムに格納する設計は、インデックスが利用できず検索性能が低下する原因にもなります。本番環境では、正規化を行い国コードを別テーブルに分割して保存する設計を検討することをおすすめします。
-
MySQLで特定のカラム名を持つテーブルを検索する方法
MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a
-
MySQLのバージョンを確認する方法をわかりやすく解説
この記事では、現在利用しているMySQLサーバーのバージョンを確認する方法について詳しく解説します。コンソールでクエリを実行する前に、まずクライアントがサーバーに正しく接続されていることを確認しておきましょう。接続が確立されていないと、クエリを実行しても結果を取得できません。MySQLのバージョンを確認する基本クエリ以下のクエリを実行すると、使用中のサーバーのバージョン番号と、実行時点の日付を同時に取得できます。mysql> SELECT VERSION(), CURRENT_DATE;ポイント: 関数「VERSION()」や「CURRENT_DATE」は大文字・小文字を区別しません。つ