sql - separar - substring db2
Crear una cadena delimitada a partir de una consulta en DB2 (4)
Básicamente, está buscando el equivalente de la función de agregado GROUP_CONCAT
de MySQL en DB2. De acuerdo con un hilo que encontré , puedes imitar este comportamiento pasando por la función XMLAGG
:
create table t1 (num int, color varchar(10));
insert into t1 values (1,''red''), (1,''black''), (2,''red''), (2,''yellow''), (2,''green'');
select num,
substr( xmlserialize( xmlagg( xmltext( concat( '', '', color ) ) ) as varchar( 1024 ) ), 3 )
from t1
group by num;
Esto regresaría
1 red,black
2 red,yellow,green
(o debería, si estoy leyendo las cosas correctamente)
Estoy intentando crear una cadena delimitada a partir de los resultados de una consulta en DB2 en el iSeries (AS / 400). He hecho esto en T-SQL, pero no puedo encontrar la manera de hacerlo aquí.
Aquí está mi código en T-SQL. Estoy buscando un Equivelant en DB2.
DECLARE @a VARCHAR(1000)
SELECT @a = COALESCE(@a + '', '' + [Description], [Description])
FROM AP.Checkbooks
SELECT @a
Si las descripciones en mi tabla se ven así:
Desc 1
Desc 2
Desc 3
Entonces devolverá esto:
Desc 1, Desc 2, Desc 3
Estoy tratando de hacer esto en OLEDB y por lo que entiendo no puedes hacer esto porque no puedes hacer nada sofisticado en SQL para OLEDB como declarar variables o crear una tabla. Así que supongo que no hay forma.
Puede hacerlo utilizando expresiones de tabla comunes (CTE) y recursión.
with
cte1 as
(select description, row_number() over() as row_nbr from checkbooks),
cte2 (list, cnt, cnt_max) AS
(SELECT VARCHAR('''', 32000), 0, count(description) FROM cte1
UNION ALL
SELECT
-- No comma before the first description
case when cte2.list = '''' THEN RTRIM(CHAR(cte1.description))
else cte2.list || '', '' || RTRIM(CHAR(cte1.description)) end,
cte2.cnt + 1,
cte2.cnt_max
FROM cte1,cte2
WHERE cte1.row_nbr = cte2.cnt + 1 AND cte2.cnt < cte2.cnt_max ),
cte3 as
(select list from cte2
where cte2.cnt = cte2.cnt_max fetch first 1 row only)
select list from cte3;
Si está ejecutando DB2 9.7 o superior, puede usar la función LISTAGG. Eche un vistazo aquí: http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.sql.ref.doc%2Fdoc%2Fr0058709.html