SQL: tagli perfetti con SPLIT

A partire dalla TR6 di IBM i 7.3, è disponibile una nuova funzione che permette di suddividere in sottostringhe una stringa che contiene valori separati da uno specifico carattere di separazione. La funzione SPLIT() restituisce una tabella nella quale ogni riga contiene una singola sottostringa di cui si compone la stringa base.

La sintassi è:

SPLIT ( espressione , separatore ) 

Dove espressione contiene un valore alfanumerico, e separatore è il carattere che suddivide le porzioni della stringa. E’ possibile indicare solo un singolo carattere separatore. Tecnicamente si tratta di una UDTF (User Defined Table Function), che restituisce una tabella e che pertanto va utilizzata con la sintassi specifica SELECT * FROM TABLE (…ecc…)

Più difficile da spiegare che da capire… vediamo subito un esempio pratico, ricordando che la funzione SPLIT(), a differenza di tutte le altre funzioni DB2 fornite da IBM non si trova nella libreria QSYS2, ma nella libreria SYSTOOLS.

Questa è la nostra stringa base:

DATA_ORDINE=20190901|CLIENTE=ACBDE|ARTICOLO=4365

Le sottostringhe sono separate dal carattere pipe ‘|’, ecco l’istruzione che scompone la stringa nelle sue tre componenti:

SELECT  *
FROM TABLE (systools.split('DATA_ORDINE=20190901|CLIENTE=ACBDE|ARTICOLO=4365', '|')) a

Ed ecco il risultato: vengono restituite due colonne, ORDINAL_POSITION (numero di riga) e ELEMENT (valore della sottostringa).

ORDINAL_POSITIONELEMENT
1DATA_ORDINE=20190901
2CLIENTE=ACBDE
3ARTICOLO=4365

La nostra stringa base contiene in realtà anche delle coppie chiave-valore a loro volta separate dal carattere “=”: combinando in sequenza due SPLIT() possiamo ottenere tutti i valori distinti. Vediamo come fare, prendendo come base una stringa di esempio che contiene una serie di parametri secondo lo stile di un URL (parametri separati da “&”, chiavi e valori separati da “=”)

-- Separa i parametri
WITH  a AS (
SELECT ordinal_position num1, CHAR(element, 50) el1
FROM TABLE (systools.split('DATA=20190901&CLIENTE=015731&ARTICOLO=43705', '&')) s1
)
-- Separa la chiave dal valore
, b AS (
SELECT num1, ordinal_position num2, CHAR(element, 50) el2
FROM a
JOIN TABLE (systools.split(a.el1, '=')) s2 ON 1=1
)
-- Compone chiave e valore sulla stessa riga
SELECT  b.num1 riga, 
        b.el2 chiave, 
        COALESCE(b2.el2, '*ERR') valore
FROM    b 
LEFT JOIN    b b2 ON b.num1=b2.num1 AND b2.num2=2
WHERE   b.num2=1

Ecco il risultato finale:

RIGACHIAVEVALORE
1DATA 20190901
2CLIENTE 015731
3ARTICOLO 43705

Con la prima SPLIT si “taglia” la stringa in corrispondenza degli “&”, con la seconda si separano i valori sul segno di uguale, con l’ultima SELECT si ricompone il tutto in righe ben ordinate. In mancanza di qualche separatore, comparirà la costante *ERR ad evidenziare la situazione.

A questo link si può trovare la documentazione IBM della funzione.

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

Recent Posts

Gestione dei file video bloccati su IBM i: una soluzione efficace

Riceviamo e pubblichiamo ben volentieri questo "tip & trick" di Patrick Rizzi che presenta una tecnica che permette di intervenire…

4 settimane ago

Monitoraggio Messaggi QSYSOPR: SQL per Ottenere Messaggi e Reply

Prendo spunto da una risposta di Michael Mayer sulle mailing list di Midrange.com a chi chiedeva come monitorare i messaggi…

4 settimane ago

Perché l’ERP è la Chiave del Successo per le Imprese Moderne

Le imprese sono sempre più alla ricerca di strumenti che possano migliorare l'efficienza, la collaborazione e la gestione delle risorse.…

3 mesi ago

ACS Access Client Solution 1.1.9.5

I primi di Aprile è uscita la "Spring Version" di ACS Access Client Solution, versione 1.1.9.5 Interessanti novità soprattutto in…

7 mesi ago

Tim Rowe and Scott Forstie – Promo video for CEC 2024 – Milan

Se non vi bastava la ricca agenda delle sessioni del Common Europe Congress 2024, 3-6 Giugno Milano, ecco un altro…

7 mesi ago

Code for IBM i 2.10.0 – Debug IBM i con Visual Studio Code

Le funzioni di debug con Visual Studio Code sono disponibili da qualche tempo ma questa nuova versione 2.10.0 semplifica la…

7 mesi ago