MySQLでハイフン区切りの文字列をセグメント単位で逆順にする方法
REVERSE()関数の基本動作
MySQLには、文字列を逆順に並べ替えるためのREVERSE()関数が用意されています。この関数を使うと、文字列内のすべての文字が後ろから前へと反転されます。
mysql> Select REVERSE('AB-CD-EF');
+---------------------+
| REVERSE('AB-CD-EF') |
+---------------------+
| FE-DC-BA |
+---------------------+
1 row in set (0.00 sec)REVERSE()だけでは不十分なケース
しかし、ハイフン(ダッシュ)で連結された文字列を「セグメント単位」で逆順にしたい場合、REVERSE()関数だけでは期待どおりの結果を得られません。上記の例では「FE-DC-BA」という出力になりますが、本来望ましい結果は「EF-CD-AB」、つまり各ブロックの順序だけを入れ替えたものです。
SUBSTRING_INDEX()とINSTR()を組み合わせた解決策
セグメント単位で逆順にするには、SUBSTRING_INDEX()関数とINSTR()関数を組み合わせて使用します。具体的には、次のようなクエリを実行します。
mysql> Select CONCAT(SUBSTRING_INDEX('AB-CD-EF','-',-1), '-', substr('AB-CD-EF',instr('AB-CD-EF',"-")+1, instr('AB-CD-EF',"-")),LEFT('AB-CD-EF',LOCATE('-','AB-CD-EF') -1))As 'Reversed';
+-----------+
| Reversed |
+-----------+
| EF-CD-AB |
+-----------+
1 row in set (0.00 sec)クエリの仕組み
このクエリは、CONCAT()関数で3つの部分を連結することで目的の結果を実現しています。
- SUBSTRING_INDEX('AB-CD-EF','-',-1):最後のセグメント「EF」を取り出します。
- substr()+instr():最初のハイフンの位置をもとに、中央のセグメント「CD」を取り出します。
- LEFT()+LOCATE():先頭から最初のハイフンまでのセグメント「AB」を取り出します。
これらを「-」で連結することで、「EF-CD-AB」という、各セグメントの内部構造を保ったまま順序だけを反転させた文字列を取得できます。セグメント数が固定のデータ(バージョン番号やコード体系など)を扱う際に特に有効なテクニックです。
-
MySQLの一時テーブルはSHOW TABLESで確認できる?テーブル一覧に表示されない理由と対処法
ご存じのとおり、SHOW TABLESステートメントを使えば、データベース内のテーブル一覧を簡単に確認できます。しかし、MySQLの一時テーブル(TEMPORARY TABLE)は、このリストには表示されません。言い換えると、SHOW TABLESステートメントでは一時テーブルを確認できないということです。以下の例で具体的に見ていきましょう。例:SHOW TABLESで一時テーブルを検索するここでは、「SalesSummary」という名前の一時テーブルをSHOW TABLESステートメントで取得しようとしています。mysql> SHOW TABLES LIKE %Sales%; Empt
-
MySQLで日付ごとの合計値を集計する方法【GROUP BY活用術】
MySQLでは、datetime型の日付データを日ごとにグループ化し、数値の合計を求めることができます。本記事では、サンプルテーブルを作成し、DATE()関数とGROUP BY句、SUM()関数を組み合わせて日付ごとの合計を集計する手順を解説します。1. サンプルテーブルの作成まず、datetime型のカラムと、日数(カウント)を格納するint型のカラムを持つテーブルを作成します。mysql> create table DemoTable ( ShippingDate datetime, CountOfDate int ); Query OK, 0 rows affect