2009-10-14 14 views
10

Estoy tratando de utilizar SQL para construir una lista separada por comas de cat_id de¿Creando una lista separada por comas?

el código es:

declare  @output varchar(max) 
set   @output = null; 
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id) 

de edición: se ha cambiado '' a nulo, TODAVÍA misma. pero la salida im conseguir es así:

, 66 , 23 

la coma líder no debería estar allí. ¿Qué me he perdido?

Respuesta

37

¿Está en SQL 2005? Con apoyos a Rob Farley que me mostraron esta recientemente:

SELECT stuff((
    SELECT ', ' + cast(cat_id as varchar(max)) 
    FROM categories 
    FOR XML PATH('') 
    ), 1, 2, ''); 

La consulta en el interior (con FOR XML PATH('')) selecciona una lista separada por comas de ID de categoría, con un líder "". La consulta externa utiliza la función stuff para eliminar la coma y el espacio iniciales.

No tengo una instancia de SQL a mano para probar esto, así que es de memoria. Puede que tenga que jugar con los parámetros de cosas, etc. para que funcione exactamente como lo desee.

+0

Ok, lo he probado y funciona como está. Definitivamente lo recomendaría sobre la técnica de 'agregar a una variable'. –

+1

¡qué es este wizardy salvaje de sql que has demostrado aquí! Begone demonios! – JDPeckham

+0

Quería adjuntar a esta respuesta: para muchas declaraciones STUFF, desea que los parámetros sean 1 y 1, no 1 y 2 para crear una lista verdaderamente separada por comas. La respuesta de Matt usa 2 porque tiene un espacio después de cada coma. Para obtener más información, consulte el artículo de MSDN: http://msdn.microsoft.com/en-us/library/ms188043.aspx – Ryanman

0

cheque @output valor justo antes de la ejecución de esta consulta, yo creo que no es igual a NULL sino para '' (cadena vacía)

EDIT: (después de la @auth editado la pregunta)

ahora estoy seguro de que es '',

tienes que inicializarlo a NULL

hacerlo independientemente CONCAT_NULL_YIELDS_NULL, utilizando la antigua CASE WHEN:

select @output = NULL 
select @output = CASE WHEN @output IS NULL THEN '' ELSE @output+', ' END + value 
+0

incluso entonces 'CONCAT_NULL_YIELDS_NULL' debe establecerse en' ON ' –

+0

correcto, gracias, no lo hice ¡No sé que existía tal opción! – manji

0

Quizás quiso inicializar @output a una cadena vacía? COALESCE solo funcionará si es una cadena NULL.

0

Lo que está haciendo mal es que @output no es nulo desde el inicio, sino una cadena vacía. Establezca @output en nulo antes del bucle (o si no se usa dado que está declarado, simplemente no le asigne una cadena vacía).

2

COALESCE Returns the first nonnull expression among its arguments

primer argumento @output + ', ' nunca es nula (a menos que inicializar @output como nulo y definen CONCAT_NULL_YIELDS_NULL-ON), por lo que siempre se devuelve.

+1

+1 para el puntero a la propiedad ANSI. Use "select sessionproperty ('CONCAT_NULL_YIELDS_NULL')" para ver su valor actual; es 1 por defecto, pero si es 0, provocará que el COALESCE del póster falle. – Andomar

0

Y a veces ...

usted tiene que responder a su propia pregunta

declare  @output varchar(max) 
select  @output = case when (@output is null) then '' else ', ' END + convert(varchar(max),cat_id) 
1
declare  @output varchar(max) 

select  @output = coalesce 
         ( 
          @output + ', ' + convert(varchar(max),cat_id), 
          convert(varchar(max),cat_id) 
        ) 
from  yourTableHere 

print  @output 
0

No estoy seguro si esto se aplica exactamente a lo que estás buscando, pero he encontrado este derecho en Al mismo tiempo que encontré tus preguntas. Utilizo la segunda solución con FOR XML PATH, que Matt Hamilton mencionó anteriormente. Me funcionó muy bien.

Concatenating Rows - By Carl P.Anderson, 2009/10/14

http://www.sqlservercentral.com/articles/T-SQL/67973/

0
/osp/install/idp/bin/sqlminus "select ri || ',' ||name|| ',' || numports || ',' || ascii(OVRONSET) from sdfctigw.ivrgrp where GRP_BEP is not null;" | sort -h 
1,COMO INTERNAL 2,700,90 
7,LOADIVR,10,80 
10,SPEECH_IVR_PROD,600,95 
Cuestiones relacionadas