2010-09-16 22 views
7

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í.Crear una cadena delimitada a partir de una consulta en DB2

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 mesa este aspecto:

la descripción 1
la descripción 2
la descripción 3

Entonces se volverá esto:

Desc 1, Desc 2, Desc 3

+0

En MySQL, esto sería 'GROUP_CONCAT()'. –

Respuesta

0

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

+1

No estoy seguro de si esto fue un comentario de mi respuesta, pero mi respuesta no declara variables ni crea tablas. Sin embargo, es posible que 'XMLAGG' no esté disponible. – CanSpice

+0

Correcto, supongo que no tengo XMLAGG, ya que no reconoce lo que sea que esté en una consulta OLEDB. –

+0

Puede usar una función de base de datos –

31

Básicamente, está buscando el equivalente de la función de agregado GROUP_CONCAT de MySQL en DB2. De acuerdo con one thread I found, puede imitar este comportamiento pasando a través de 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 volvería

1 red,black 
2 red,yellow,green 

(o debería, si estoy leyendo cosas correctamente)

+2

+1, comentario lateral: si está ejecutando en Z/OS v10, entonces cambie 'como varchar (1024)' a 'como clob (1024)' –

+1

. He estado buscando esto por años. Esto funciona para exactamente lo que necesito. Gracias. –

1

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; 
Cuestiones relacionadas