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ò 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!

Related Posts
DB2 for i SQL – String Manipulation – POSSTR-LOCATE-LOCATE_IN_STRING (EN)

Introduction Often, in our applications, we need to work with text strings, and DB2 SQL can come in very useful 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

View Comments

  • 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

Recent Posts

IBM i: La gestione del sistema è più semplice di quanto pensi

Con questo post voglio consigliarti la lettura di questo articolo di Giancarlo Lui sulla TechXChange Community: IBM i System Management:…

2 mesi ago

RPG Free e option(*convert) per una migliore gestione parametri

Nel suo recente articolo "Option *convert in RPG Free" , Aldo Succi esplora l'opzione *CONVERT nel linguaggio RPG, evidenziando come…

2 mesi ago

Aggiornamento Certificati CA per BCE: Guida Pratica

Guida pratica all'aggiornamento dei certificati Java e DCM per consumo web services via SQL HTTPGETCLOB e HTTP_GET.

3 mesi ago

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…

6 mesi 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…

6 mesi 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.…

8 mesi ago