CONCAT / LENGTH
| 対応: | SQL-92(1992) |
|---|
文字列を結合したり、文字列の長さを取得するための関数です。DBMSによって関数名や演算子が異なるため、使用するDBに合わせて書き方を変える必要があります。
構文
『CONCAT』: 文字列を結合します(MySQL・PostgreSQL)。
CONCAT(文字列1, 文字列2, ...)
『||』演算子: 文字列を結合します(PostgreSQL・SQLite・SQL標準)。
文字列1 || 文字列2
『LENGTH』: 文字列のバイト数または文字数を返します。
LENGTH(文字列)
『CHAR_LENGTH』 / 『CHARACTER_LENGTH』: 文字数を返します。
CHAR_LENGTH(文字列)
構文一覧
| 関数・演算子 | 概要 |
|---|---|
| CONCAT(s1, s2, ...) | 引数の文字列を順に結合して返します。引数にNULLが含まれるとNULLを返します(MySQLはNULL_IF有効時のみ)。 |
| CONCAT_WS(区切り, s1, s2) | 区切り文字を挟みながら結合します。NULLの引数は無視されます(MySQL)。 |
| s1 || s2 | SQL標準の文字列結合演算子です(PostgreSQL・SQLiteなど)。 |
| LENGTH(s) | MySQLではバイト数、PostgreSQLでは文字数を返します。 |
| CHAR_LENGTH(s) | マルチバイト文字も1文字として数えた文字数を返します(MySQL・PostgreSQL)。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
last_name と first_name を結合して氏名を作成します。
sample_concat_length.sql
SELECT
CONCAT(last_name, ' ', first_name) AS full_name,
email
FROM employees;
+--------------------+--------------------+ | full_name | email | +--------------------+--------------------+ | 孫 悟空 | goku@example.com | | ブリーフス ブルマ | bulma@example.com | | ブリーフス ベジータ | vegeta@example.com | +--------------------+--------------------+ 3 rows in set
区切り文字を挟んで結合します。
sample_concat_length.sql
SELECT
CONCAT_WS('_', last_name, first_name) AS name_code,
email
FROM employees;
+--------------------+--------------------+ | name_code | email | +--------------------+--------------------+ | 孫_悟空 | goku@example.com | | ブリーフス_ブルマ | bulma@example.com | | ブリーフス_ベジータ | vegeta@example.com | +--------------------+--------------------+ 3 rows in set
メールアドレスの文字数を取得します。
sample_concat_length.sql
SELECT
email,
CHAR_LENGTH(email) AS email_length
FROM employees
ORDER BY email_length;
+--------------------+--------------+ | email | email_length | +--------------------+--------------+ | goku@example.com | 16 | | bulma@example.com | 17 | | vegeta@example.com | 18 | +--------------------+--------------+ 3 rows in set
以下は他の関数を組み合わせた応用例です。メールアドレスの@より前のユーザー名部分の長さを求めます。
sample_concat_length.sql
SELECT
email,
CHAR_LENGTH(
SUBSTRING(email, 1, POSITION('@' IN email) - 1)
) AS username_length
FROM employees;
+--------------------+-----------------+ | email | username_length | +--------------------+-----------------+ | goku@example.com | 4 | | bulma@example.com | 5 | | vegeta@example.com | 6 | +--------------------+-----------------+ 3 rows in set
データベース別の書き方
MySQL / MariaDB
『CONCAT』と『CONCAT_WS』が使用できます。
SELECT CONCAT(last_name, ' ', first_name) AS full_name FROM employees;
SELECT CONCAT_WS('_', last_name, first_name) AS name_code FROM employees;
SELECT email, CHAR_LENGTH(email) AS email_length FROM employees;
PostgreSQL
『CONCAT』と『||』演算子の両方が使用できます。
SELECT CONCAT(last_name, ' ', first_name) AS full_name FROM employees; SELECT last_name || ' ' || first_name AS full_name FROM employees; SELECT email, CHAR_LENGTH(email) AS email_length FROM employees;
SQLite
SQLite では『CONCAT』関数がないため、『||』演算子を使います。
SELECT last_name || ' ' || first_name AS full_name FROM employees; SELECT LENGTH(email) AS email_length FROM employees;
概要
『CONCAT』はNULLを含む引数を渡すとNULLを返すDBMSが多いです。NULLをスキップしたい場合は『CONCAT_WS』か『COALESCE』でNULLを空文字に変換してから渡してください。
文字数を数える場合、MySQLの『LENGTH』はバイト数を返すため、日本語(UTF-8)は1文字が3バイトとしてカウントされます。日本語の文字数を正確に数えるには『CHAR_LENGTH』を使ってください。
部分文字列の取り出しは『SUBSTRING / TRIM』を、文字位置の検索は『POSITION / INSTR』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。