Categorias:

Funções de cadeia de caracteres e binários (Geral) , Funções de tabela

SPLIT_TO_TABLE

Esta função de tabela divide uma cadeia de caracteres (baseado em um delimitador especificado) e nivela os resultados em linhas.

Consulte também:

SPLIT

Sintaxe

SPLIT_TO_TABLE(<string>, <delimiter>)
Copy

Argumentos

string

Texto a ser dividido.

delimiter

Texto para dividir a cadeia de caracteres.

Saída

Esta função retorna as seguintes colunas:

Nome da coluna

Tipo de dados

Descrição

SEQ

NUMBER

Um número de sequência exclusivo associado ao registro de entrada. Não há garantia de que a sequência esteja livre de lacunas ou ordenada de nenhuma maneira específica.

INDEX

NUMBER

O índice de base um do elemento.

VALUE

VARCHAR

O valor do elemento da matriz nivelada.

Nota

A consulta também pode acessar as colunas da tabela original (correlacionada) que serviram como fonte de dados para esta função. Se uma única linha da tabela original resultou em várias linhas na exibição nivelada, os valores nessa linha de entrada são replicados para corresponder ao número de linhas produzidas por essa função.

Exemplos

Aqui está um exemplo simples de entrada constante.

SELECT table1.value
  FROM TABLE(SPLIT_TO_TABLE('a.b', '.')) AS table1
  ORDER BY table1.value;
Copy
+-------+
| VALUE |
|-------|
| a     |
| b     |
+-------+

Criar uma tabela e inserir dados:

CREATE OR REPLACE TABLE splittable (v VARCHAR);
INSERT INTO splittable (v) VALUES ('a.b.c'), ('d'), ('');
SELECT * FROM splittable;
Copy
+-------+
| V     |
|-------|
| a.b.c |
| d     |
|       |
+-------+

É possível usar a palavra-chave LATERAL com a função SPLIT_TO_TABLE para que a função seja executada em cada linha da tabela splittable como uma tabela correlacionada:

SELECT *
  FROM splittable, LATERAL SPLIT_TO_TABLE(splittable.v, '.')
  ORDER BY SEQ, INDEX;
Copy
+-------+-----+-------+-------+
| V     | SEQ | INDEX | VALUE |
|-------+-----+-------+-------|
| a.b.c |   1 |     1 | a     |
| a.b.c |   1 |     2 | b     |
| a.b.c |   1 |     3 | c     |
| d     |   2 |     1 | d     |
|       |   3 |     1 |       |
+-------+-----+-------+-------+

Crie outra tabela que contenha autores em uma coluna e alguns de seus títulos de livros em outra coluna, separados por vírgulas:

CREATE OR REPLACE TABLE authors_books_test (author VARCHAR, titles VARCHAR);
INSERT INTO authors_books_test (author, titles) VALUES
  ('Nathaniel Hawthorne', 'The Scarlet Letter , The House of the Seven Gables,The Blithedale Romance'),
  ('Herman Melville', 'Moby Dick,The Confidence-Man');
SELECT * FROM authors_books_test;
Copy
+---------------------+---------------------------------------------------------------------------+
| AUTHOR              | TITLES                                                                    |
|---------------------+---------------------------------------------------------------------------|
| Nathaniel Hawthorne | The Scarlet Letter , The House of the Seven Gables,The Blithedale Romance |
| Herman Melville     | Moby Dick,The Confidence-Man                                              |
+---------------------+---------------------------------------------------------------------------+

Use a palavra-chave LATERAL e a função SPLIT_TO_TABLE para executar uma consulta que retorna uma linha separada para cada título. Além disso, use a função TRIM para remover espaços iniciais e final dos títulos. Observe que a lista SELECT inclui a coluna value fixa que é retornada pela função:

SELECT author, TRIM(value) AS title
  FROM authors_books_test, LATERAL SPLIT_TO_TABLE(titles, ',')
  ORDER BY author;
Copy
+---------------------+-------------------------------+
| AUTHOR              | TITLE                         |
|---------------------+-------------------------------|
| Herman Melville     | Moby Dick                     |
| Herman Melville     | The Confidence-Man            |
| Nathaniel Hawthorne | The Scarlet Letter            |
| Nathaniel Hawthorne | The House of the Seven Gables |
| Nathaniel Hawthorne | The Blithedale Romance        |
+---------------------+-------------------------------+