Convertir cadenas a tablas.

¿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.

About these ads

2 respuestas a Convertir cadenas a tablas.

  1. [...] 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 [...]

  2. [...] 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 [...]

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 44 seguidores

%d personas les gusta esto: