Catégories :

Fonctions de chaîne et fonctions binaires (général) , Fonctions de table

SPLIT_TO_TABLE

Cette fonction de table divise une chaîne (en fonction d’un délimiteur spécifié) et aplatit les résultats en lignes.

Voir aussi :

SPLIT

Syntaxe

SPLIT_TO_TABLE(<string>, <delimiter>)
Copy

Arguments

string

Texte à scinder.

delimiter

Texte par lequel diviser la chaîne.

Sortie

Cette fonction renvoie les colonnes suivantes :

Nom de la colonne

Type de données

Description

SEQ

NUMBER

Un numéro de séquence unique associé à l’enregistrement d’entrée. Il n’est pas garanti que la séquence ne présente pas d’écart ou qu’elle soit ordonnée d’une manière particulière.

INDEX

NUMBER

L’index de base un de l’élément.

VALUE

VARCHAR

Valeur de l’élément du tableau aplati.

Note

La requête peut également accéder aux colonnes de la table d’origine (corrélée) ayant servi de source de données pour cette fonction. Si une seule ligne de la table d’origine a donné plusieurs lignes dans la vue aplatie, les valeurs de cette ligne d’entrée sont répliquées pour correspondre au nombre de lignes produites par cette fonction.

Exemples

Voici un exemple simple sur une entrée constante.

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

Créer une table et insérer des données :

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

Vous pouvez utiliser le LATERAL mot-clé avec la fonction SPLIT_TO_TABLE afin que la fonction s’exécute sur chaque ligne de la table splittable comme une table corrélée :

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

Créez une autre table contenant les auteurs dans une colonne et certains de leurs titres de livres dans une autre colonne, séparés par des virgules :

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

Utilisez le mot-clé LATERAL et la fonction SPLIT_TO_TABLE pour exécuter une requête qui renvoie une ligne distincte pour chaque titre. De plus, utilisez la fonction TRIM pour supprimer les espaces de début et de fin des titres. Notez que la liste SELECT comprend la colonne fixe value renvoyée par la fonction :

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