02 - Database DB2 for i02a - SQL

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

Last Updated on 2 Agosto 2019 by Roberto De Pedrini

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

2 Comments

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *