Publicado el Dejar un comentario

Obtener lista de valores separados por comas con sql en Oracle 10g

Si queremos obtener  una lista de valores separados por comas, cuyos valores representen el contenido de una columna de varias filas, en Oracle 10g, podemos usar la función PL/SQL WMSYS.WM_CONCAT.

Veamos un ejemplo más ilustrativo:

select WMSYS.WM_CONCAT(ename) as "Lista de nombres" from scott.emp;

Nos daría como resultado:

Una sola fila con la lista de los nombres de empleados separados por comas.

Podemos también mostrar los resultados agrupados por otro campo, por ejemplo el número de departamento:

select deptno as "Departamento", WMSYS.WM_CONCAT(ename) as "Lista de nombres" 
from scott.emp
group by deptno;

Por cada grupo, en esta caso número de departamento, crea una lista de los empleados pertenecientes a cada uno.

Hay que comentar que Oracle no recomienda el uso de esta función porque no está soportada por ellos. De hecho en la versión 12g está fución ha sido eliminada. A partir de la versión 11g fue reemplazada por LISTAGG la cual veremos en otra entrada.

Es posible también lograr el listado de  nombres por departamento en Oracle 10g  sin utilizar la función WMSYS.WM_CONCAT. Utilizando las sentencias analíticas de Oracle que se muestran aquí.

¡Hasta la próxima!

Publicado el Dejar un comentario

Localizar una cadena de caracteres dentro de un campo en Oracle

A veces nos vemos en la necesidad de saber si en el valor de un campo de una tabla en Oracle se encuentra cierto caracter o secuencia de caracteres.

Oracle cuenta con la función INSTR para llevar a cabo esta tarea. La función regresa un número entero que indica la posición dentro de la cadena de caracteres que contiene el campo de el o la secuencia de caracteres buscados. Por ejemplo la siguiente instrucción:

select ename as "Nombre", instr(ename, 'RK', 1, 1) as "Posicion de RK" from emp;

Mostrará el nombre y la posición de la cadena RK dentro del nombre:

Como se muestra en los resultados, solo la fila con el valor de CLARK en la columna Nombre tiene el valor de que representa la posición inicial de la cadena RK en dicha columna.

¿Que representan los 4 valores o parámetros en la función INSTR? El primer parámetro es la cadena de caracteres donde se va a hacer la búsqueda, en este caso la columna ename de la tabla empEl segundo parámetro es la cadena que buscamos, en este caso RK. El tercer parámetro indica a partir de cual caracter queremos hacer la búsqueda, en este caso desde el caracter 1. El cuarto y último parámetro de la función indica que número de ocurrencia queremos encontrar, en este caso la primera ocurrencia; por ejemplo si quisiéramos encontrar la segunda ocurrencia de la cadena R en el Nombre sería:

select ename as "Nombre", instr(ename, 'R', 1, 2) as "Posicion de RK" from emp;

Lo que nos arrojaría los siguientes resultados:

Como se puede observar, sólo en el nombre TURNER encontró una segunda ocurrencia de la cadena en la posición 6. El nombre CLARK, sólo tiene una ocurrencia de R por lo que el resultad arroja 0, es decir, no encontrado.

Ahora, ¿y si ponemos un número negativo en el parámetro que indica a partir de que caracter queremos buscar? Así:

select ename as "Nombre", instr(ename, 'R', -1, 2) as "Posicion de R" from emp;

Le estamos indicando que la búsqueda la haga de derecha a izquierda (de revesa) comenzando por la primera posición.  Esto nos daría el resultado siguiente:

Como podemos observar, ahora la consulta nos muestra el nombre TURNER y la posición de R en 3, que es la segunda ocurrencia de la R en TURNER pero de derecha a izquierda a partir de la posición 1 (contando de derecha a izquierda)Si le indicamos un -2 en la posición desde dónde queremos la búsqueda, buscará desde el penúltimo caracter hacia la izquierda, lo que nos dará un resultado de 0 en todas las filas, porque no hay ningún nombre que cumpla con la condición:

select ename as "Nombre", instr(ename, 'R', -2, 2) as "Posicion de R" from emp;

¿Alguna duda? Deja tu comentario.

¡Hasta la próxima!

 

Publicado el Dejar un comentario

Crear una tabla a partir de una consulta en Oracle

A veces necesitamos crear una nueva tabla con un subconjunto de datos de otra tabla para ya sea obtener reportes o analizar datos. El proceso podría ser, primero definir los campos y crear la tabla que va a contener los datos necesitados y luego insertar los datos por medio de una consulta (query) hecha a la tabla original.

Podemos ahorrarnos el paso de la definición de los campos y creación de la tabla utilizando la sentencia sql CREATE TABLE .. AS. La sentencia define los campos en base a los número y tipo de datos devueltos por la consulta.

Por ejemplo, tenemos una tabla llamada EMP que contiene información de los empleados de una empresa:

Con la siguiente estructura:

Y queremos crear una tabla que contenga sólo los campos EMPNO, ENAME y SAL y los datos de los empleados del departamento (DEPTNO) número 20. Para ello ejecutaríamos la siguiente sentencia SQL:

CREATE TABLE departamento20 AS
SELECT empno, ename, sal 
FROM emp
WHERE deptno = 20;

La sentencia anterior nos crea la tabla llamada departamento20 y con los datos de los empleados del departamento (DEPTNO) 20 como muestra la siguiente imagen:

Con la estructura que se muestra enseguida:

¡Nos vemos a la próxima!