カテゴリ:

文字列とバイナリ関数 (一般)

SPLIT_PART

指定された文字列を分割し、リクエストされた部分を返します。

指定した文字以降のすべての文字を返すには、 POSITIONSUBSTR 関数を使用できます。例については、 メール、電話、日付文字列の部分文字列を返す をご参照ください。

Tip

検索最適化サービスを使用すると、この関数を呼び出すクエリのパフォーマンスを向上させることができます。詳細については、 検索最適化サービス をご参照ください。

こちらもご覧ください:

SPLIT, STRTOK

構文

SPLIT_PART(<string>, <delimiter>, <partNumber>)
Copy

引数

string

部分に分割されるテキストです。

delimiter

分割する区切り文字を表すテキストです。区切り文字列全体は、複数の文字が含まれている場合でも、単一の区切り文字として扱われます。この動作は、区切り文字の各文字を個別の区切り文字として扱う:doc:`strtok`とは異なります。

partNumber

分割された要素の指定番号です。この番号は1から数え始める形式であるため、最初のトークンは番号0ではなく番号1となります。

値が負の場合、部分は文字列の終わりから逆方向にカウントされます。

戻り値

この関数は VARCHAR型の値を返します。

いずれかの引数が NULL の場合、関数は NULL を返します。

使用上の注意

  • partNumber が範囲外の場合、戻り値は空の文字列です。

  • 文字列が区切り文字で始まるか、区切り文字で終了する場合、システムは区切り文字の前または後の空きスペースを、それぞれ分割結果の有効な部分と見なします。例については、以下の`例`_セクションを参照してください。これは、空の文字列を返さない:doc:`strtok`とは異なり、SPLIT_PARTは分割結果として空の文字列を返すことができることを意味します。

  • partNumber が0の場合は、1として扱われます。つまり、分割の最初の要素を取得します。インデックスが1ベースであるか0ベースであるかに関する混乱を避けるために、Snowflakeは1の同義語として0を使用することを避けるようにお勧めします。

  • 区切り文字が空の文字列の場合、分割後の戻り値は入力文字列になります(文字列は分割されません)。

照合順序の詳細

The collation specifications of all input arguments must be compatible.

この関数は、次の照合仕様をサポートしません。

  • pi (句読点は区別しない)。

  • cs-ai (大文字と小文字は区別、アクセント記号は区別しない)。

以下の例では、 SPLIT_PART関数を呼びだしています。

指定番号の違いによる戻り値の比較

以下の例は、指定する:samp:`{partNumber}`の値に応じて、どのような結果が返されるかを示したものです。

SELECT column1 part_number_value, column2 portion
  FROM VALUES
    (0, SPLIT_PART('11.22.33', '.',  0)),
    (1, SPLIT_PART('11.22.33', '.',  1)),
    (2, SPLIT_PART('11.22.33', '.',  2)),
    (3, SPLIT_PART('11.22.33', '.',  3)),
    (4, SPLIT_PART('11.22.33', '.',  4)),
    (-1, SPLIT_PART('11.22.33', '.',  -1)),
    (-2, SPLIT_PART('11.22.33', '.',  -2)),
    (-3, SPLIT_PART('11.22.33', '.',  -3)),
    (-4, SPLIT_PART('11.22.33', '.',  -4));
Copy
+-------------------+---------+
| PART_NUMBER_VALUE | PORTION |
|-------------------+---------|
|                 0 | 11      |
|                 1 | 11      |
|                 2 | 22      |
|                 3 | 33      |
|                 4 |         |
|                -1 | 33      |
|                -2 | 22      |
|                -3 | 11      |
|                -4 |         |
+-------------------+---------+

IPアドレスの最初と最後の部分の取得

以下の例は、localhostのIPアドレス:code:`127.0.0.1`の最初と最後の部分を返します。

SELECT SPLIT_PART('127.0.0.1', '.', 1) AS first_part,
       SPLIT_PART('127.0.0.1', '.', -1) AS last_part;
Copy
+------------+-----------+
| FIRST_PART | LAST_PART |
|------------+-----------|
| 127        | 1         |
+------------+-----------+

先頭文字が区切り文字である場合の動作

以下の例では、垂直バーで区切られた文字列から、1番目と2番目の要素が返されます。入力文字列の先頭が区切り文字であるため、分割後の最初の要素は空の文字列となります。

SELECT SPLIT_PART('|a|b|c|', '|', 1) AS first_part,
       SPLIT_PART('|a|b|c|', '|', 2) AS last_part;
Copy
+------------+-----------+
| FIRST_PART | LAST_PART |
|------------+-----------|
|            | a         |
+------------+-----------+

複数文字で構成される区切り文字の使用例

以下の例では、複数文字で構成される区切り文字を指定した場合の動作を示しています。

SELECT SPLIT_PART('aaa--bbb-BBB--ccc', '--', 2) AS multi_character_delimiter;
Copy
+---------------------------+
| MULTI_CHARACTER_DELIMITER |
|---------------------------|
| bbb-BBB                   |
+---------------------------+

区切り文字が空文字である場合の動作

以下の例は、区切り文字が空文字である場合、分割処理を行っても結果として得られるのは単一の文字列のみであることを示しています。

SELECT column1 part_number_value, column2 portion
  FROM VALUES
    (1, SPLIT_PART('user@snowflake.com', '',  1)),
    (-1, SPLIT_PART('user@snowflake.com', '', -1)),
    (2, SPLIT_PART('user@snowflake.com', '',  2)),
    (-2, SPLIT_PART('user@snowflake.com', '', -2));
Copy
+-------------------+--------------------+
| PART_NUMBER_VALUE | PORTION            |
|-------------------+--------------------|
|                 1 | user@snowflake.com |
|                -1 | user@snowflake.com |
|                 2 |                    |
|                -2 |                    |
+-------------------+--------------------+

STRTOKとSPLIT_PARTの挙動の違い

この例では、区切り文字が繰り返される場合のSTRTOKとSPLIT_PARTの挙動の違いを示しています。STRTOKは、区切り文字として指定された:code:'|-'`という文字列内の各文字を個別の区切り文字として扱います。つまり、:code:'|'と:code:'-'のいずれかが現れるたびに分割を行います。対照的に、SPLIT_PARTは、指定された:code:'|-'`という文字列全体を1つの区切り文字として扱います。そのため、その正確なシーケンスが現れた場所でのみ分割を行います。

SELECT STRTOK('data1||data2|-data3---data4', '|-', 1) AS strtok_1,
       STRTOK('data1||data2|-data3---data4', '|-', 2) AS strtok_2,
       STRTOK('data1||data2|-data3---data4', '|-', 3) AS strtok_3,
       STRTOK('data1||data2|-data3---data4', '|-', 4) AS strtok_4,
       SPLIT_PART('data1||data2|-data3---data4', '|-', 1) AS split_part_1,
       SPLIT_PART('data1||data2|-data3---data4', '|-', 2) AS split_part_2,
       SPLIT_PART('data1||data2|-data3---data4', '|-', 3) AS split_part_3;
Copy
+----------+----------+----------+----------+-----------------+--------------+--------------+
| STRTOK_1 | STRTOK_2 | STRTOK_3 | STRTOK_4 | SPLIT_PART_1    | SPLIT_PART_2 | SPLIT_PART_3 |
|----------+----------+----------+----------+-----------------+--------------+--------------|
| data1    | data2    | data3    | data4    | data1||data2    | data3---data4|              |
+----------+----------+----------+----------+-----------------+--------------+--------------+