Last Updated on 2 Agosto 2019 by Roberto De Pedrini
Index
Introduzione
Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l’SQL del DB2 può tornarci molto utile e semplificare il nostro codice. In questa guida vediamo alcune interessanti funzioni di SQL per la manipolazione delle stringhe:
- POSSTR – Ricerca della posizione all’interno di una stringa
- LOCATE e LOCATE_IN_STRING – Ricerca della posizione con qualche opzione in più
POSSTR – Ricerca posizione in una stringa
Questa funzione torna la posizione iniziale di un carattere o di una stringa all’interno di un’altra stringa, ad esempio se cerco “only” all’interno della stringa “This is only an example” mi aspetto un “9” come risultato… semplice direi!
select posstr('This is only an example', 'only') from sysibm.sysdummy1; -- Result 9
In un esempio concreto potremmo utilizzare la funzione POSSTR per fare il “parsing” di un CSV:
-- (1) Simuliamo una tabella con una stringa tipo CSV
CREATE or replace TABLE
qtemp.my_csv_file
(csvstring varchar(300));
--(2) Popoliamo la tabella con qualche esempio
INSERT INTO qtemp.my_csv_file (csvstring)
VALUES('Christine;Hass')
,('Micheal;Thompson')
,('Roberto;De Pedrini');
--(3) Leggiamo il contenuto normale
SELECT csvstring from qtemp.my_csv_file;
-- Risultato
CSVSTRING
Christine;Hass
Micheal;Thompson
Roberto;De Pedrini
;
--(4) Eseguiamo il parsing del CSV
SELECT substr(csvstring, 1, POSSTR(csvstring, ';')-1) AS FirstName,
substr(csvstring, POSSTR(csvstring, ';')+1) AS LastName
FROM qtemp.my_csv_file;
-- Result
FIRSTNAME LASTNAME
Christine Hass
Micheal Thompson
Roberto De Pedrini
LOCATE
Quando le cose si complicano e dobbiamo cercare una stringa dentro un’altra partendo da una determinata posizione LOCATE e LOCATE_IN_STRING risultano più utili della funzione POSSTR appena vista: attenzione però alla sintassi di queste scalar function… i parametri sono questa volta invertiti rispetto a prima.
Partiamo da un esempio semplice … cerchiamo la stringa “this” partendo dalla posizione 10 di una seconda stringa:
select locate('this', 'this is only an example, but this time we can start everywhere', 10)
from sysibm.sysdummy1;
-- Result
30
Partendo dalla tabella in QTEMP creata nel passo precedente, questa volta utilizziamo la funzione LOCATE per ottenere un risultato simile:
SELECT substr(csvstring, 1, locate(';', csvstring,1)-1) AS FirstName,
substr(csvstring, locate(';', csvstring, 1)+1) aS LastName
FROM qtemp.my_csv_file;
-- Result
FIRSTNAME LASTNAME
Christine Hass
Micheal Thompson
Roberto De Pedrini
LOCATE_IN_STRING
Quando il gioco si fa duro… LOCATE_IN_STRING inizia a giocare!
Ti piace vincere facile con un CSV di soli due elementi! Complichiamoci la vita con un esempio un po’ più reale. Attenzione … i parametri della scalar funtion si invertono un’altra volta … grazie SQL per renderci sempre la vita facile (“li mortacci tua!’).
-- (1) Simuliamo una tabella con una stringa tipo CSV
CREATE or replace TABLE
qtemp.my_csv_file
(csvstring varchar(300));
--(2) Popoliamo la tabella con qualche esempio
INSERT INTO qtemp.my_csv_file (csvstring)
VALUES('Christine;Hass;A01;Press')
,('Micheal;Thompson;A02;Manager')
,('Roberto;De Pedrini;A03;Big Boss');
--(3) Leggiamo il contenuto normale
SELECT csvstring from qtemp.my_csv_file;
-- Risultato
CSVSTRING
Christine;Hass;A01;Press
Micheal;Thompson;A02;Manager
Roberto;De Pedrini:A03;Big Boss
;
--(4) Eseguiamo il parsing del CSV
SELECT locate_in_string (csvstring, ';',1,1) as Primo,
locate_in_string (csvstring, ';',1,2) as Secondo,
locate_in_string (csvstring, ';',1,3) as terzo
FROM qtemp.my_csv_file;
SELECT substr(csvstring, 1, locate_in_string (csvstring, ';',1,1)-1) AS FirstName,
substr(csvstring, locate_in_string (csvstring, ';',1,1)+1, locate_in_string (csvstring, ';',1,2)-locate_in_string (csvstring, ';',1,1)-1) aS LastName,
substr(csvstring, locate_in_string (csvstring, ';',1,2)+1, locate_in_string (csvstring, ';',1,3)-locate_in_string (csvstring, ';',1,2)-1) aS Workdepth,
substr(csvstring, locate_in_string (csvstring, ';',1,3)+1) aS Job
FROM qtemp.my_csv_file;
-- Result
FIRSTNAME LASTNAME WORKDEPTH JOB
Christine Hass A01 Press
Micheal Thompson A02 Manager
Roberto De Pedrini A03 Big Boss
Conclusione
Tre semplici scalar function per la manipolazione delle stringhe… ma molto altro ci aspetta!
Prova commento da Roberto De Pedrini
Salve, comodissima la funzione POSSTR e LOCATE_IN_STRING. Il problema sorge quando devo utilizzarle in un pgm batch. Utilizzare tali funzioni e parcheggiare il risultato in un campo di comodo.
Grazie