カテゴリ:

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

STRTOK

指定された文字列をトークン化し、要求された部分を返します。

こちらもご参照ください。

SPLIT_PART

構文

STRTOK(<string> [,<delimiter>] [,<partNumber>])
Copy

引数

必須:

string

トークン化されるテキストです。

オプション:

delimiter

トークン化する区切り文字のセットを表すテキストです。区切り文字列の各文字は個別の区切り文字です。たとえば、区切り文字が:code:'@.'`の場合、:code:'@'と:code:'.'`の両方が区切り文字として扱われます。この動作は、区切り文字全体を単一の区切り文字列として扱う:doc:`split_part`とは異なります。

区切り文字が空で、:samp:`{string}`が空の場合、関数はNULLを返します。区切り文字が空で、:samp:`{string}`が空でない場合、文字列全体が1つのトークンとして扱われます。

デフォルト:単一のスペース文字

partNumber

リクエストされたトークン。この番号は1から数え始める形式であるため、最初のトークンは番号0ではなく番号1となります。トークン番号が範囲外の場合は、 NULL が返されます。

デフォルト:1

戻り値

戻り値のデータ型はVARCHARです。

要求された部分が存在しないか、いずれかの引数がNULLの場合、NULLが返されます。

使用上の注意

Linux strtok()と同様に、 STRTOK がトークンとして空の文字列を返すことはありません。この動作は、入力文字列が区切り文字で始まっていたり終わっていたりする場合や、区切り文字が連続している場合に、空の文字列を要素として返すことがある:doc:`split_part`とは異なります。

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

文字列内の最初のトークンを返す

次の簡単な例では、STRTOKを呼び出して文字列内の最初のトークンを返します。

SELECT STRTOK('a.b.c', '.', 1);
Copy
+-------------------------+
| STRTOK('A.B.C', '.', 1) |
|-------------------------|
| a                       |
+-------------------------+

複数の区切り文字を使用して異なるトークンを返す

次の例は、区切り文字が``@``および``.``の場合に、複数の区切り文字を使用して1番目、2番目、3番目のトークンを返す方法を示しています。

SELECT STRTOK('user@snowflake.com', '@.', 1);
Copy
+---------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM', '@.', 1) |
|---------------------------------------|
| user                                  |
+---------------------------------------+
SELECT STRTOK('user@snowflake.com', '@.', 2);
Copy
+---------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM', '@.', 2) |
|---------------------------------------|
| snowflake                             |
+---------------------------------------+
SELECT STRTOK('user@snowflake.com', '@.', 3);
Copy
+---------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM', '@.', 3) |
|---------------------------------------|
| com                                   |
+---------------------------------------+

文字列内のトークンの総数を超えてインデックスを指定

以下の例では、文字列に含まれるトークンの総数を超えてインデックスを指定した場合に、どのような結果になるかを示しています。

SELECT STRTOK('user@snowflake.com.', '@.', 4);
Copy
+----------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM.', '@.', 4) |
|----------------------------------------|
| NULL                                   |
+----------------------------------------+

1番目の要素が文字列の末尾を超えてしまう場合

この例では、入力文字列が空であり、要素はありません。したがって、1番目の要素を指定したとしても、それは文字列の末尾を超えていると見なされ、関数は空の文字列の代わりにNULLを返します。

SELECT STRTOK('', '', 1);
Copy
+-------------------+
| STRTOK('', '', 1) |
|-------------------|
| NULL              |
+-------------------+

空の区切り文字を使用してSTRTOKを呼び出す

空の区切り文字列を使用した例を次に示します。

SELECT STRTOK('a.b', '', 1);
Copy
+----------------------+
| STRTOK('A.B', '', 1) |
|----------------------|
| a.b                  |
+----------------------+

引数にNULL値を指定した場合の動作

以下の例では、それぞれの引数にNULL値を指定した場合にどのような結果になるかを示しています。

SELECT STRTOK(NULL, '.', 1);
Copy
+----------------------+
| STRTOK(NULL, '.', 1) |
|----------------------|
| NULL                 |
+----------------------+
SELECT STRTOK('a.b', NULL, 1);
Copy
+------------------------+
| STRTOK('A.B', NULL, 1) |
|------------------------|
| NULL                   |
+------------------------+
SELECT STRTOK('a.b', '.', NULL);
Copy
+--------------------------+
| STRTOK('A.B', '.', NULL) |
|--------------------------|
| NULL                     |
+--------------------------+

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|              |
+----------+----------+----------+----------+-----------------+--------------+--------------+