SQL連結関数(CONCAT/CONCAT_WS)を使ってクエリを作成する方法
データベースから取得した生のデータを、別の用途に合わせて整形して利用したい場面はよくあります。本記事では、MySQLのクエリ内で文字列を扱う際に役立つ関数をいくつか紹介します。
スキーマの準備
まずは、本記事で解説するSQLの概念を実際に試すための簡単なスキーマを用意しましょう。使用するのはMySQLです。構文の練習やクエリの実行には、SQL Fiddleなどのオンラインツールがおすすめです。SQL Fiddleなら、他のリレーショナルデータベースでクエリをテストすることもできます。
テーブルの作成と値の挿入
CREATE TABLE birthdays (
name varchar(200) NOT NULL,
birthday varchar(10) NOT NULL
);
INSERT INTO birthdays (name, birthday) VALUES("Jane", "11/20/1993");
INSERT INTO birthdays (name, birthday) VALUES("Duncan", "01/15/1987");
INSERT INTO birthdays (name, birthday) VALUES("Lucas", "07/21/1996");
INSERT INTO birthdays (name, birthday) VALUES("Alexa", "12/31/1988");
最初の4行で、「name」と「birthday」という2つのカラムを持つ「birthdays」テーブルを作成し、残りの行でデータを挿入しています。このテーブルは、後ほどクエリ文を組み立てる際に使用します。
このテーブルに対して基本的なSELECTクエリを実行すると、結果は次のようになります。
SELECT name, birthday FROM birthdays;
実行結果:
| name | birthday |
| Jane | 11/20/1993 |
| Duncan | 01/15/1987 |
| Lucas | 07/21/1996 |
| Alexa | 12/31/1988 |
クエリ文の組み立て
CONCAT()関数
CONCAT()関数は、引数として渡した文字列を連結し、その結果を1つの文字列として返します。引数は1つ以上指定でき、複数渡すことも可能です。引数には次のような型を指定できます。
- バイナリ文字列 – 引数のいずれかがバイナリ文字列の場合、戻り値もバイナリ文字列になります。
- 非バイナリ文字列 – 一般的な文字列値です。すべての引数が非バイナリ文字列の場合、
CONCAT()は非バイナリ文字列を返します。 - 数値 – 数値型の引数は、他の引数と連結される前に非バイナリ文字列へと暗黙的に変換されます。
- NULL – MySQLでは、引数のいずれか1つでもNULLが含まれていると、
CONCAT()はNULLを返します。NULLを除外しながら連結したい場合は、後述のCONCAT_WS()を使うか、IFNULL()などと組み合わせるとよいでしょう。
正式な構文は以下の通りです。
CONCAT( <文字列1>, <文字列2>, [ … <文字列N> ]);
関数であることを示すために、CONCATキーワードの後に括弧を付けます。括弧の中には、連結したいN個の文字列を指定します。MySQLでの使用例を見てみましょう。
SELECT CONCAT(name, " ", birthday) AS Result FROM birthdays;
このクエリでは、name・半角スペース・birthdayを連結した結果をSELECTし、「Result」という別名を付けています。
実行結果は次の通りです。
| Result |
| Jane 11/20/1993 |
| Duncan 01/15/1987 |
| Lucas 07/21/1996 |
| Alexa 12/31/1988 |
この結果を、「スキーマの準備」セクションで実行した元のクエリと比べてみてください。何が違うでしょうか。また、このようにデータを整形して取得することには、どのようなメリットがあるでしょうか。
正解・不正解はありません。アプリケーション側でそのデータをどのように扱いたいかによって、最適な形は変わります。
CONCAT_WS()関数
CONCAT_WS()関数はCONCAT()関数とほぼ同じですが、最初の引数に「区切り文字(セパレーター)」を必ず指定する点が異なります。この区切り文字が、それ以降の各引数の間に挿入されます。その他の動作ルールはCONCAT()と共通です。
正式な構文は以下の通りです。
CONCAT_WS(<区切り文字>, <文字列1>, <文字列2>, [ … <文字列N> ]);
括弧内の最初の引数が区切り文字で、以降の引数が連結対象の文字列です。MySQLでの使用例を見てみましょう。
SELECT CONCAT_WS(", ", name, birthday) AS Result
FROM birthdays;
このクエリでは、各引数の間に最初の引数「", "」(カンマ+スペース)が挿入された文字列が返されます。
実行結果:
| Result |
| Jane, 11/20/1993 |
| Duncan, 01/15/1987 |
| Lucas, 07/21/1996 |
| Alexa, 12/31/1988 |
CONCAT()関数と同様に、CONCAT_WS()関数も「Result」という名前の1つのカラムのみを返し、その値は区切り文字で連結された文字列になります。さらに、CONCAT_WS()は区切り文字より後ろにあるNULL値を自動的にスキップするため、NULLが混在するデータの連結にも便利です。
まとめ
本記事では、MySQLにおけるSQLのCONCAT()関数とCONCAT_WS()関数の使い方を解説しました。PostgreSQLやSQL Serverなど他のリレーショナルデータベースでは、SQL方言の違いにより構文が多少異なる場合がありますが、文字列を連結するという概念自体は共通しています。詳細については、各データベースの公式ドキュメントを参照してください。
-
ExcelのCONCATENATE関数の使い方!複数セルの文字列を簡単に結合する方法
ExcelのCONCATENATE(コンカティネート)関数は、文字列が入った複数のセルを1つのセルにまとめたいときに便利な機能です。Excelには数値計算のための関数が数多く用意されていますが、この関数は「テキスト」を扱うためのもの。氏名や住所など、どんな文字列でも、元のセルの中身を変更することなく自由に結合できます。 CONCATENATE関数を使う前に知っておきたいルール ほとんどのExcel関数と同様に、CONCATENATE関数にもいくつかのルールや制限があります。事前に把握しておくと、思わぬエラーを防げます。 1. Excelのバージョンによる関数名の違い まずは関数名につい
-
ExcelのROUND関数で数値を丸める方法|四捨五入をわかりやすく解説
Excelで資料を見やすく整えたいとき、数値を小数点以下や整数単位で丸めると、ぐっと読みやすくなります。数値を丸めるということは、重要度の低い桁を取り除くことを意味します。その結果、必要な精度を保ちながら、より見栄えの良い値に仕上げることができます。 丸め処理は、概算を示したり、数値を扱いやすくしたりする目的でよく使われます。たとえば、割引率を計算して「17.3587563」という数値が出た場合、小数第1位で丸めれば「17.4%」となり、はるかに見やすくなります。この記事では、ROUND関数を使って数値を丸める方法を詳しくご紹介します。 ExcelのROUND関数とは ROUND関数は、Ex