Categorias:

Funções de cadeia de caracteres e binários (General)

STRTOK

Tokeniza uma determinada cadeia de caracteres e retorna a parte solicitada.

Consulte também:

SPLIT_PART

Sintaxe

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

Argumentos

Obrigatório:

string

Texto a ser tokenizado.

Opcional:

delimiter

Texto que representa o conjunto de delimitadores a serem utilizados. Cada caractere na cadeia de caracteres do delimitador é um delimitador separado. Por exemplo, se o delimitador for '@.', ambos '@' e '.' serão tratados como delimitadores. Esse comportamento é diferente no SPLIT_PART, que trata o delimitador inteiro como uma única cadeia de caracteres do delimitador.

Se o delimitador estiver vazio, e o string estiver vazio, então a função retorna NULL. Se o delimitador estiver vazio e string não estiver vazio, a cadeia de caracteres inteira será tratada como um token.

Padrão: sem valor. Um único caractere de espaço

partNumber

Token solicitado, que é baseado em 1; portanto, o primeiro token é o token número 1, e não o token número 0. Se o número do token estiver fora da faixa, então NULL é retornado.

Padrão: 1

Retornos

O tipo de dados do valor retornado é VARCHAR.

Se a parte solicitada não existir ou nenhum argumento for NULL, NULL será retornado.

Notas de uso

Assim como o Linux strtok(), STRTOK nunca retorna uma cadeia de caracteres vazia como um símbolo. Esse comportamento é diferente no SPLIT_PART, que pode retornar cadeias de caracteres vazias como partes quando a cadeia de caracteres de entrada começa ou termina com o delimitador, ou quando há delimitadores consecutivos.

Exemplos

Os exemplos a seguir chamam a função STRTOK:

Retornar o primeiro token em uma cadeia de caracteres

O exemplo simples a seguir chama STRTOK para retornar o primeiro token em uma cadeia de caracteres:

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

Usar vários delimitadores para retornar tokens diferentes

Este exemplo mostra como usar vários delimitadores para retornar o primeiro, segundo e terceiro tokens quando os delimitadores são @ e .:

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

Demonstrar a indexação além do último token possível na cadeia de caracteres

O exemplo a seguir demonstra o que acontece quando você indexa além do último token possível na cadeia de caracteres:

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

Demonstrar como o primeiro elemento pode ultrapassar o final da cadeia de caracteres

Neste exemplo, a cadeia de caracteres de entrada está vazia e não há elementos. Sendo assim, o primeiro elemento ultrapassa o final da cadeia de caracteres, e a função retorna NULL em vez de uma cadeia de caracteres vazia:

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

Chamar STRTOK com um delimitador vazio

Aqui está um exemplo com uma cadeia de caracteres delimitadora vazia:

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

Demonstrar valores NULL para argumentos

Os exemplos a seguir especificam valores NULL para cada um dos argumentos:

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

Demonstrar as diferenças entre STRTOK e SPLIT_PART

Este exemplo demonstra a diferença entre STRTOK eSPLIT_PART ao usar delimitadores repetidos. O STRTOK trata cada caractere na cadeia de caracteres do delimitador '|-' como um delimitador separado, dividindo a cada caractere '|' e '-'. Ao contrário, o SPLIT_PART trata a cadeia de caracteres inteira do delimitador '|-' como um único delimitador, portanto, ele só divide onde esta sequência exata aparece:

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