Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
CONCAT / LENGTH
文字列を結合したり、文字列の長さを取得するための関数です。DBMSによって関数名や演算子が異なるため、使用するDBに合わせて書き方を変える必要があります。
構文
-- CONCAT: 文字列を結合します(MySQL・PostgreSQL・SQL Server)。 CONCAT(文字列1, 文字列2, ...) -- ||演算子: 文字列を結合します(PostgreSQL・Oracle・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・SQL Server)。 |
| s1 || s2 | SQL標準の文字列結合演算子です(PostgreSQL・Oracle・SQLiteなど)。 |
| LENGTH(s) | MySQLではバイト数、PostgreSQL・Oracleでは文字数を返します。 |
| CHAR_LENGTH(s) | マルチバイト文字も1文字として数えた文字数を返します(MySQL・PostgreSQL)。 |
サンプルコード
-- 姓と名を結合して氏名を作成します。
SELECT
CONCAT(姓, ' ', 名) AS 氏名,
メールアドレス
FROM 社員;
-- 区切り文字付きで住所を結合します。
SELECT
CONCAT_WS(' ', 都道府県, 市区町村, 番地) AS 住所
FROM 顧客;
-- 商品名の文字数でフィルタリングします。
SELECT 商品名, CHAR_LENGTH(商品名) AS 文字数
FROM 商品
WHERE CHAR_LENGTH(商品名) <= 10
ORDER BY 文字数;
-- メールアドレスの@より前のユーザー名部分の長さを求めます。
SELECT
メールアドレス,
CHAR_LENGTH(
SUBSTRING(メールアドレス, 1, POSITION('@' IN メールアドレス) - 1)
) AS ユーザー名文字数
FROM 社員;
実行結果
-- 氏名の結合結果。 氏名 | メールアドレス -----------+------------------------- 山田 太郎 | yamada@example.com 鈴木 花子 | suzuki@example.com 佐藤 次郎 | sato@example.com -- 商品名の文字数一覧。 商品名 | 文字数 ------------------+------- マグカップ | 5 ボールペン | 5 ノートパッド | 6
データベース別の書き方
『CONCAT』は MySQL・PostgreSQL・SQL Server で共通して使用できます。Oracle は 12c 以降で『CONCAT』に対応していますが、引数が2つまでに制限されます。3つ以上の文字列を結合するには『||』演算子を使います。
-- Oracle: CONCAT は2引数のみ。3つ以上は || を使います。 SELECT 姓 || ' ' || 名 AS 氏名 FROM 社員;
『||』演算子は PostgreSQL・Oracle・SQLite で使用できます。SQL Server では『||』は使えないため、『CONCAT』または『+』演算子を使います。
-- SQL Server: + 演算子で結合します(NULLがあるとNULLになります)。 SELECT 姓 + ' ' + 名 AS 氏名 FROM 社員;
『CHAR_LENGTH』は MySQL・PostgreSQL で共通です。Oracle では『LENGTH』が文字数を返すため、そのまま使えます。SQL Server では『LEN』を使います。
-- SQL Server: LEN で文字数を返します(末尾空白は除外されます)。 SELECT 商品名, LEN(商品名) AS 文字数 FROM 商品;
概要
『CONCAT』はNULLを含む引数を渡すとNULLを返すDBMSが多いです。NULLをスキップしたい場合は『CONCAT_WS』か『COALESCE』でNULLを空文字に変換してから渡してください。
文字数を数える場合、MySQLの『LENGTH』はバイト数を返すため、日本語(UTF-8)は1文字が3バイトとしてカウントされます。日本語の文字数を正確に数えるには『CHAR_LENGTH』を使ってください。
部分文字列の取り出しは『SUBSTRING / TRIM』を、文字位置の検索は『POSITION / INSTR』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。