コマンド道場

$ 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_onnentsukihi
2025-11-0520251105
2025-11-1820251118
2025-12-0220251202
2025-12-0920251209
2025-12-2420251224
2026-01-0720260107
2026-01-2120260121
2026-02-0320260203

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_banmehani_gaihani_gai_no_nagasanullif_de_null_ni
b0true

1

NULL ではないので、区別したいときは NULLIF を挟みます。

説明

SPLIT_PART は文字列を区切り文字で分け、指定した位置の 1 つを返します。位置は 1 から数えます。

⚠️ 範囲外を指定しても、エラーにも NULL にもなりません。空文字が返ります。「値が無い」と「空文字」を区別したい場面では、NULLIF(SPLIT_PART(...), '') で NULL に寄せてください。

日付文字列やコード体系の分解に便利ですが、区切り文字がデータの中に紛れ込むと結果が崩れます。氏名を空白で分けるような使い方は、ミドルネームや二重姓で破綻します。

⚠️ SPLIT_PARTPostgreSQL 固有です。全部の断片が要るなら STRING_TO_ARRAYREGEXP_SPLIT_TO_TABLE を使います。

次に読む

根拠にした一次情報