SPLIT
Extraire une liste de valeurs contenues dans une chaine de caractères et spérarées par un délimiteur
Fonction :
La fonction table SPLIT permet de récupérer sous forme de plusieurs lignes, les différentes valeurs contenues dans une même chaine de caractères et séparées par un délimiteur.
Syntaxe :
La fonction table SPLIT se trouvant dans la bibliothèque SYSTOOLS, il faut donc la préfixer de « SYSTOOLS. » pour l’utiliser.
SYSTOOLS.SPLIT(ma_chaine_de_caractères, ‘mon_séparateur‘)
Lorsqu’une seule chaine de caractères est à décomposer, l’utilisation de la table fonction SPLIT est très simple (Voir exemple 1 et 2 ci-dessous).
Mais cela se complexifie lorsque la requête retourne plusieurs chaines à décomposer, il faut alors utiliser une CTE (Common Table Expression) et une jointure de type CROSS JOIN (Voir Exemple 3 ci-dessous) pour pouvoir décomposer la chaine de caractères de chaque enregistrement lu.
Exemples :
Exemple 1 : Décomposer une chaine statique donnée.
SELECT * FROM TABLE
(
SYSTOOLS.SPLIT( ‘Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Décembre’, ‘, ‘)
);
La décomposition se fait grâce au séparateur ‘, ‘ et la requête retourne les 12 éléments suivants :

Préparation des Exemples 2 et 3 : Création de la table des mois dans une langue donnée.
La table des mois QTEMP.TABLE_MOIS contiendra les 2 champs suivants :
- La langue
- La liste des mois de l’année dans la langue
- Suppression de la table au cas où elle aurait déjà été créée dans QTEMP :
DROP TABLE QTEMP.TABLE_MOIS; - Création de la table avec alimentation du premier enregistrement avec les mois en français :
CREATE TABLE QTEMP.TABLE_MOIS AS (
SELECT ‘Français’ AS LANGUE,
‘Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Décembre’ AS LISTE_MOIS
FROM SYSIBM.SYSDUMMY1
) WITH DATA; - Ajout d’un second enregistrement avec la liste des mois en anglais :
INSERT INTO QTEMP.TABLE_MOIS
SELECT ‘Anglais’ AS LANGUE, ‘January, February, March, Apri, May, June, July, August, September, October, November, December’
AS LISTE_MOIS FROM SYSIBM.SYSDUMMY1;
La table QTEMP.TB_MOIS contient donc les 2 enregistrements suivants :

Exemple 2 : Décomposition d'une seule des listes de mois
Si on ne souhaite décomposer qu’une seule des listes de mois, l’utilisation de SPLIT reste simple.
Il suffit de ne sélectionner qu’un seul enregistrement de la table QTEMP.TABLE_MOIS.
SELECT * FROM TABLE(SYSTOOLS.SPLIT( (SELECT LISTE_MOIS FROM QTEMP.TABLE_MOIS LIMIT 1) , ‘, ‘));
Retourne les 12 mois du premier enregistrement trouvé ( ici ce sont les mois en français ) :

SELECT * FROM TABLE(SYSTOOLS.SPLIT( (SELECT LISTE_MOIS FROM QTEMP.TABLE_MOIS WHERE LANGUE = ‘Anglais’) , ‘, ‘));
Retourne les 12 mois de l’enregistrement sélectionné par la clause WHERE c’est à dire les mois en anglais :

Exemple 3 : Décomposition de plusieurs mêmes chaines de caractères présentes dans plusieurs enregistrements
Si on souhaite décomposer toutes les listes de mois de la table TABLE_MOIS, l’utilisation de SPLIT va se complexifier car la requête suivante ne fonctionnera pas :
SELECT * FROM TABLE(SYSTOOLS.SPLIT( (SELECT LISTE_MOIS FROM QTEMP.TABLE_MOIS) , ‘, ‘));
En effet elle retourne un code erreur -881 car le SELECT LISTE_MOIS FROM QTEMP.TABLE_MOIS retourne 2 enregistrements.
Pour palier à cela, il faut définir une CTE (Common Table Expression) et faire une jointure de type CROSS JOIN avec la fonction table SPLIT.
Ainsi la fonction table SPLIT sera bien exécutée sur chaque élément de la CTE.
WITH TB_MOIS AS(
SELECT LANGUE, LISTE_MOIS FROM QTEMP.TABLE_MOIS
)
SELECT A.LANGUE, B.ORDINAL_POSITION, B.ELEMENT
FROM TB_MOIS A
CROSS JOIN TABLE(SYSTOOLS.SPLIT(A.LISTE_MOIS, ‘, ‘)) B
ORDER BY A.LANGUE, B.ORDINAL_POSITION;
La requête retourne bien les 24 mois, extraits de la liste des mois en français et de la liste des mois en anglais, triés selon les critères saisis dans la clause ORDER BY :
