$ man split-part
SPLIT_PART
文字列関数区切り文字で分けて、指定した位置の断片を取り出す。範囲外は空文字。
呼び出しの形
SPLIT_PART(対象, 区切り文字, 何番目)
つまずきやすいところ
範囲外は空文字です。エラーにも NULL にもなりません。区別したいなら
NULLIF(..., '')を挟んでください。位置は 1 から数えます。0 を渡すとエラーになります。
PostgreSQL 固有です。他の製品では
SUBSTRING_INDEX(MySQL)などに書き換えが要ります。
実行例
結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。
SELECT juchu_on, SPLIT_PART(juchu_on::text, '-', 1) AS nen, SPLIT_PART(juchu_on::text, '-', 2) AS tsuki, SPLIT_PART(juchu_on::text, '-', 3) AS hi FROM juchu ORDER BY juchu_on
| juchu_on | nen | tsuki | hi |
|---|---|---|---|
| 2025-11-05 | 2025 | 11 | 05 |
| 2025-11-18 | 2025 | 11 | 18 |
| 2025-12-02 | 2025 | 12 | 02 |
| 2025-12-09 | 2025 | 12 | 09 |
| 2025-12-24 | 2025 | 12 | 24 |
| 2026-01-07 | 2026 | 01 | 07 |
| 2026-01-21 | 2026 | 01 | 21 |
| 2026-02-03 | 2026 | 02 | 03 |
10 行(うち 8 行を表示)
SELECT SPLIT_PART('a,b,c', ',', 2) AS ni_banme, SPLIT_PART('a,b,c', ',', 9) AS hani_gai, LENGTH(SPLIT_PART('a,b,c', ',', 9)) AS hani_gai_no_nagasa, NULLIF(SPLIT_PART('a,b,c', ',', 9), '') IS NULL AS nullif_de_null_ni| ni_banme | hani_gai | hani_gai_no_nagasa | nullif_de_null_ni |
|---|---|---|---|
| b | 0 | true |
1 行
NULL ではないので、区別したいときは NULLIF を挟みます。
説明
SPLIT_PART は文字列を区切り文字で分け、指定した位置の 1 つを返します。位置は 1 から数えます。
⚠️ 範囲外を指定しても、エラーにも NULL にもなりません。空文字が返ります。「値が無い」と「空文字」を区別したい場面では、NULLIF(SPLIT_PART(...), '') で NULL に寄せてください。
日付文字列やコード体系の分解に便利ですが、区切り文字がデータの中に紛れ込むと結果が崩れます。氏名を空白で分けるような使い方は、ミドルネームや二重姓で破綻します。
⚠️ SPLIT_PART は PostgreSQL 固有です。全部の断片が要るなら STRING_TO_ARRAY や REGEXP_SPLIT_TO_TABLE を使います。
次に読む
使い方を順に読むなら
根拠にした一次情報
- PostgreSQL 18 マニュアル: 文字列関数と演算子(2026-09-02 確認)