¿Quién no ha tenido que convertir alguna vez cadenas de caracteres con un separador en una tabla para tratarla en SQL?
Normalmente se utilizan funciones con iteraciones con INTR() y SUBSTR(), o complicadas estructuras con DECODE o CASE…
Tanel Poder ha implementado un ejemplo muy simple utilizando las funciones que tratan expresiones regulares (“regular expressions”). Lo malo es que esas funciones -a las que hay que echar un ojo detenidamente, por su gran potencial- sólo están disponibles a partir de 10g.
Así pues, aquí hay otra solución que aprovecha las utilísimas funciones analíticas (LAG() en este caso) para conseguir los mismos resultados en Oracle 9:
carlosal@db01.xxxxxx> SELECT * FROM V$VERSION
2 /
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
PL/SQL Release 9.2.0.7.0 - Production
CORE 9.2.0.7.0 Production
TNS for 32-bit Windows: Version 9.2.0.7.0 - Production
NLSRTL Version 9.2.0.7.0 - Production
carlosal@db01.xxxxxx> define separator=";"
carlosal@db01.xxxxxx> define mystring="1;22;333;4444;5;66;77"
carlosal@db01.xxxxxx>
carlosal@db01.xxxxxx> SELECT SUBSTR( '&mystring' || '&separator',
2 NVL(LAG(TOKEN) OVER (ORDER BY TOKEN),0) + 1,
3 TOKEN - (NVL(LAG(TOKEN) OVER (ORDER BY TOKEN),0) + 1))
4 FROM (
5 SELECT LEVEL,
6 INSTR( '&mystring' || '&separator', '&separator', 1, LEVEL ) TOKEN
7 FROM DUAL
8 CONNECT BY
9 INSTR( '&mystring' || '&separator', '&separator', 1, LEVEL ) != 0
10 ORDER BY
11 LEVEL
12 )
13 /
SUBSTR('1;22;333;4444;
----------------------
1
22
333
4444
5
66
77
7 filas seleccionadas.
carlosal@db01.xxxxxx>
Saludos.
Carlos.
26 Junio 2007 a las 13:03 |
[...] tablas (resultsets) a cadenas. El otro día veíamos una forma sencilla de cómo convertir cadenas a tablas para poder tratarlas fácilmente con SQL.Hoy vamos a hacer lo contrario: convertir un [...]
5 Junio 2009 a las 12:58 |
[...] escribí sobre cómo hacerlo en Oracle, pero en Teradata la cosa es un poco más complicada. Partiremos aquí también de una solución [...]