PDA

View Full Version : [Oracle] Eseguire uno split di un record


robertino_salemi
11-05-2015, 09:10
Buongiorno a tutti,
ho un colonna 'note' il cui contenuto può essere del tipo:
"Buongiorno a tutti||Che splendida giornata"

Vorrei eseguire una query che mi permetta di ottenere:
- string1 = "Buongiorno a tutti"
- string2 = "che splendida giornata"
ovviamente se uno dei due record è vuoto torno una stringa vuota...

Suggerimenti?

Grazie.

robertino_salemi
11-05-2015, 10:00
Ho scritto questa soluzione:

SELECT
REGEXP_SUBSTR ('Buongiorno||Che splendida giornata', '[^||]+', 1, 1) AS string1,
REGEXP_SUBSTR ('Buongiorno||Che splendida giornata', '[^||]+', 1, 2) AS string2
FROM DUAL;

ma se si verifica che la prima parte è vuota, cioè:

SELECT
REGEXP_SUBSTR ('Buongiorno||Che splendida giornata', '[^||]+', 1, 1) AS string1,
REGEXP_SUBSTR ('||Che splendida giornata', '[^||]+', 1, 2) AS string2
FROM DUAL;

la query non funziona più! :(

Maui78
11-05-2015, 13:39
Non so se ho capito bene quello che vuoi fare.....puoi provare se questa ti funziona ? Io ho lavorato sul campo, non sulla stringa ed ho inserito il doppio pipe come delimitatore.

SELECT NVL(SUBSTR(col1,1
,INSTR(col1,'||')-1
),col1),
SUBSTR(col1
,INSTR(col1,'||',-1)+2
)
FROM table

robertino_salemi
11-05-2015, 13:58
Cia Maui78,
restituisce il mio stesso problema, se manca la prima parte del testo "Buongiorno" la seconda parte "Che splendida giornata" viene visualizzata nella prima colonna string1

Maui78
11-05-2015, 14:05
Cia Maui78,
restituisce il mio stesso problema, se manca la prima parte del testo "Buongiorno" la seconda parte "Che splendida giornata" viene visualizzata nella prima colonna string1

:doh:
Ti ho allegato la prima prova che ho fatto....
Questa dovrebbe andar bene...

SELECT SUBSTR(col1,1
,INSTR(col1,'||')-1
),
SUBSTR(col1
,INSTR(col1,'||',-1)+2
)
FROM table

robertino_salemi
11-05-2015, 15:22
Maui78,
ho replicato tutti i possibili casi:

SELECT
/*CASO CORRETTO*/
SUBSTR('Buongiorno||Che splendida giornata',1,INSTR('Buongiorno||Che splendida giornata','||')-1) AS S1,
SUBSTR('Buongiorno||Che splendida giornata',INSTR('Buongiorno||Che splendida giornata','||',-1)+2) AS S2,
/*PRIMO BLOCCO SENZA || */
SUBSTR('Buongiorno',1,INSTR('Buongiorno','||')-1) AS S3,
SUBSTR('Buongiorno',INSTR('Buongiorno','||',-1)+2) AS S4,
/*SECONDO BLOCCO SENZA IL PRIMO*/
SUBSTR('||Che splendida giornata',1,INSTR('||Che splendida giornata','||')-1) AS S5,
SUBSTR('||Che splendida giornata',INSTR('||Che splendida giornata','||',-1)+2) AS S6,
/*PRIMO BLOCCO CON LA PIPE */
SUBSTR('Buongiorno||',1,INSTR('Buongiorno||','||')-1) AS S7,
SUBSTR('Buongiorno||',INSTR('Buongiorno||','||',-1)+2) AS S8
FROM DUAL


l'anomalia si verifica nella colonna S3 e S4
https://dl.dropboxusercontent.com/u/50056863/oracle_split_pipe.jpg

Come poterlo risolvere?

Grazie.

Maui78
12-05-2015, 06:58
Avevo capito il doppio pipe fosse sempre presente, invece non è così ?!
Nel campo S4 non c'è....
Se così fosse bisogna inserire una if all'interno della query, magari usando la decode...

robertino_salemi
12-05-2015, 08:58
Va bene così, la stringa viene generata da me, se dovesse mancare la seconda parte di essa, alla prima concateno comunque una ||.

Grazie! :D