una separar por functions extraer delimitada convert comas caracteres caracter cadena buscar sql db2 ibm-midrange

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;