SQL で 2 つ以上の文字列列を連結したいですか? SQL CONCAT 関数を使用して文字列を連結する方法を学習します。
データベース テーブルにクエリを実行するとき、単一の列からデータを取得するのではなく、複数のテキスト/文字列の列を連結する必要がある場合があります。これは、解釈しやすく読みやすい出力が必要な場合に役立ちます。
たとえば、
first_name
フィールドと
last_name
フィールドを連結することで、
full_name
フィールドを選択できます。同様に、番地、都市、州、その他の必要なフィールドを連結することで、
full_address
を取得できます。
SQL では、CONCAT 関数を使用して文字列を連結できます。このガイドでは、以下について説明します。
- SQL CONCAT 関数の構文
- 使用例
- 連結時の 1 つ以上の列の NULL 値の処理
始めましょう!
SQL CONCAT 関数の構文
SQL CONCAT 関数を使用する構文は次のとおりです。
CONCAT(string_1, string_2, ..., string_n);
ここで、
string_1
、
string_2
、…、
string n
連結される文字列を示します。これらは、文字列リテラル、列、または両方の組み合わせにすることができます。
CONCAT を使用した文字列リテラルの連結
CONCAT 関数は文字列リテラルの連結にも使用できるため、簡単な例をコーディングしてみましょう。
ここでは、文字列「Hello, 」と「world!」を連結しています。
greeting
文字列として:
SELECT CONCAT('Hello, ', 'world!') AS greeting;
上記のクエリを実行すると、次の出力が得られます。
+---------------+
| greeting |
+---------------+
| Hello, world! |
+---------------+
1 row in set (0.00 sec)
ただし、実際には、文字列リテラルではなく、データベース テーブル内の必要な列を連結したい場合があります。それでは、SQL で CONCAT 関数を使用していくつかの例をコーディングしてみましょう。
SQL で列を連結する方法
次に、データベース テーブルのクエリに移りましょう。
📑 このチュートリアルのすべてのサンプル クエリは、 MySQL データベース テーブルで実行されました。ただし、選択した別の RDBMS を使用することもできます。
レコードを含むデータベーステーブルの作成
使用できるデータベースを作成しましょう。
CREATE DATABASE db1;
use db1;
データベース
db1
に
employees
テーブルを作成しましょう。これを行うには、次の列と対応するデータ型を指定して
CREATE TABLE
ステートメントを実行します。
CREATE TABLE employees (
ID INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
street VARCHAR(100),
city VARCHAR(50),
state VARCHAR(2),
username VARCHAR(20)
);
次に、
employees
テーブルにいくつかのレコードを挿入しましょう。
INSERT INTO employees (first_name, last_name, street, city, state, username) VALUES
('John', 'Smith', '123 Main St', 'New York', 'NY', 'john123'),
('Alice', 'Johnson', '456 Elm St', 'Boston', 'MA', 'alice456'),
('Bob', 'Williams', '789 Oak St', 'Chicago', 'IL', 'bob789'),
('Mary', 'Davis', '321 Pine St', 'Houston', 'TX', 'mary456'),
('James', 'Brown', '555 Cedar St', 'Seattle', 'WA', 'james789'),
('Emily', 'Jones', '777 Maple St', 'Atlanta', 'GA', 'emily123'),
('Michael', 'Miller', '999 Birch St', 'Miami', 'FL', 'michael456'),
('Jessica', 'Wilson', '111 Walnut St', 'Dallas', 'TX', 'jessica789'),
('William', 'Taylor', '222 Cherry St', 'Denver', 'CO', 'william123'),
('Sarah', 'Martinez', '444 Pine St', 'Phoenix', 'AZ', 'sarah456');
例 1: フルネームを表示
最初の例として、
first_name
と
last_name
列を連結して
full_name
を取得しましょう。これを行うには、次のように SELECT クエリで SQL CONCAT 関数を使用します。
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
次の出力が得られるはずです。
+----------------+
| full_name |
+----------------+
| John Smith |
| Alice Johnson |
| Bob Williams |
| Mary Davis |
| James Brown |
| Emily Jones |
| Michael Miller |
| Jessica Wilson |
| William Taylor |
| Sarah Martinez |
+----------------+
10 rows in set (0.00 sec)
first_name
と
last_name
に加えて、リテラル文字列 ‘ ‘ で指定される区切り文字としてスペースも使用していることに注目してください。
例 2: アドレスの構築
次に、別の例を見てみましょう。
employees
テーブルには、
street
、
city
、および
state
列があります。したがって、これら 3 つのフィールドをカンマを区切り文字として連結することで、
full_address
を選択できます。
SELECT CONCAT(street, ', ', city, ', ', state) AS full_address FROM employees;
出力は次のとおりです。
+---------------------------+
| full_address |
+---------------------------+
| 123 Main St, New York, NY |
| 456 Elm St, Boston, MA |
| 789 Oak St, Chicago, IL |
| 321 Pine St, Houston, TX |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ |
+---------------------------+
10 rows in set (0.00 sec)
例 3: プロファイル URL の作成
employees
テーブルに
username
フィールドがあることを思い出してください。
ルート ドメイン
https://www.example.com/
があり、ユーザー プロファイルが
https://www.example.com/user
にあるとします。次のように CONCAT 関数を使用して
profile_url
を生成できます。
SELECT CONCAT('https://www.example.com/user/', username) AS profile_url
FROM employees;
ご覧のとおり、すべての従業員のプロファイル URL を取得します。
+-----------------------------------------+
| profile_url |
+-----------------------------------------+
| https://www.example.com/user/john123 |
| https://www.example.com/user/alice456 |
| https://www.example.com/user/bob789 |
| https://www.example.com/user/mary456 |
| https://www.example.com/user/james789 |
| https://www.example.com/user/emily123 |
| https://www.example.com/user/michael456 |
| https://www.example.com/user/jessica789 |
| https://www.example.com/user/william123 |
| https://www.example.com/user/sarah456 |
+-----------------------------------------+
10 rows in set (0.00 sec)
NULL値の処理
従業員テーブルでは、すべてのレコードに すべての フィールドがあります。しかし、NULL 値を持つフィールドが 1 つ以上ある場合はどうなるでしょうか?
この場合の例を見てみましょう。ここでは、ID = 2 に対応するレコードを更新して、番地列を NULL に設定します。
UPDATE employees
SET street = NULL
WHERE ID = 2; -- Update the record with ID 2
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
次に、CONCAT を使用して
full_address
を選択します。
SELECT CONCAT(street, ', ', city, ', ', state) AS full_address FROM employees;
出力は次のとおりです。
+---------------------------+
| full_address |
+---------------------------+
| 123 Main St, New York, NY |
| NULL |
| 789 Oak St, Chicago, IL |
| 321 Pine St, Houston, TX |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ |
+---------------------------+
10 rows in set (0.00 sec)
結果セットの 2 番目の要素が NULL であることに注意してください。
ただし、住所の大まかなアイデアを得るために、出力を
city
と
state
列を連結したものにしたいと考えています。このような NULL 値がある場合は、CONCAT 関数の代わりに
CONCAT_WS を
使用できます。どのように機能するかを見てみましょう。
CONCAT_WS を使用した連結時の NULL 値の処理
CONCAT_WS は、1 つ以上のフィールドに NULL 値が含まれている疑いがある場合に使用できる CONCAT の代替手段です。
CONCAT_WS 関数は次のように使用できます。
CONCAT_WS(separator, string_1, string_2,..., string_n)
次に、次の SELECT クエリを実行します。
SELECT CONCAT_WS(', ', street, city, state) AS full_address FROM employees;
次の出力が得られます。
+---------------------------+
| full_address |
+---------------------------+
| 123 Main St, New York, NY |
| Boston, MA |
| 789 Oak St, Chicago, IL |
| 321 Pine St, Houston, TX |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ |
+---------------------------+
10 rows in set (0.01 sec)
ご覧のとおり、結果セットの 2 番目の項目では、
street
フィールドが NULL であるため、「Boston MA」が取得されます。
⚠ CONCAT_WSを使用する場合はセパレータの指定が 必須 です。区切り文字を指定しない場合、1 つ以上の列が NULL の場合、結果は NULL になります (CONCAT と同様)。
まとめ
これまでに学んだことを復習してみましょう。
-
データを取得するためにデータベース テーブルにクエリを実行する場合、複数の文字列列を連結して、より有用で解釈しやすいクエリ結果を取得することができます。これを行うには、SQL で CONCAT 関数を構文
CONCAT(string_1, string_2, ..., string_n)で使用します。 -
文字列リテラル、列、または両方の組み合わせを連結できます。ただし、1 つ以上の NULL 値がある場合、その特定のレコードの結果は NULL になります。これを処理するには、
CONCAT_WS(separator, string_1, string_2, ..., string_n)という構文でCONCAT_WSを使用できます。 -
CONCAT_WS指定された区切り文字を使用して存在する文字列のみを連結することにより、NULL 値をより適切に処理します。
SQL コマンドとその使用法を簡単に確認するには、この SQL チートシートをブックマークしてください。






![2021 年に Raspberry Pi Web サーバーをセットアップする方法 [ガイド]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)





