SQL Server convert select a column and convert it to a string

前端 未结 10 468
礼貌的吻别
礼貌的吻别 2020-12-05 05:28

Is it possible to write a statement that selects a column from a table and converts the results to a string?

Ideally I would want to have comma separated values.

相关标签:
10条回答
  • 2020-12-05 05:52
    SELECT  CAST(<COLUMN Name> AS VARCHAR(3)) + ','
    FROM    <TABLE Name>
    FOR     XML PATH('')
    
    0 讨论(0)
  • 2020-12-05 05:53

    The current accepted answer doesn't work for multiple groupings.
    Try this when you need to operate on categories of column row-values.

    Suppose I have the following data:

    +---------+-----------+
    | column1 |  column2  |
    +---------+-----------+
    | cat     | Felon     |
    | cat     | Purz      |
    | dog     | Fido      |
    | dog     | Beethoven |
    | dog     | Buddy     |
    | bird    | Tweety    |
    +---------+-----------+
    

    And I want this as my output:

    +------+----------------------+
    | type |        names         |
    +------+----------------------+
    | cat  | Felon,Purz           |
    | dog  | Fido,Beethoven,Buddy |
    | bird | Tweety               |
    +------+----------------------+
    

    (If you're following along:

    create table #column_to_list (column1 varchar(30), column2 varchar(30))
    insert into #column_to_list
    values 
    ('cat','Felon'),
    ('cat','Purz'),
    ('dog','Fido'),
    ('dog','Beethoven'),
    ('dog','Buddy'),
    ('bird','Tweety')
    

    )

    Now – I don’t want to go into all the syntax, but as you can see, this does the initial trick for us:

    select ',' + cast(column2 as varchar(255)) as [text()]  
    from #column_to_list sub
    where column1 = 'dog'
    for xml path('')
    --Using "as [text()]" here is specific to the “for XML” line after our where clause and we can’t give a name to our selection, hence the weird column_name
    

    output:

    +------------------------------------------+
    | XML_F52E2B61-18A1-11d1-B105-00805F49916B |
    +------------------------------------------+
    | ,Fido,Beethoven,Buddy                    |
    +------------------------------------------+
    

    You can see it’s limited in that it was for just one grouping (where column1 = ‘dog’) and it left a comma in the front, and additionally it’s named weird.

    So, first let's handle the leading comma using the 'stuff' function and name our column stuff_list:

    select stuff([list],1,1,'') as stuff_list
    from (select ',' + cast(column2 as varchar(255)) as [text()]
             from #column_to_list sub
             where column1 = 'dog'
             for xml path('')
             ) sub_query([list]) 
    --"sub_query([list])" just names our column as '[list]' so we can refer to it in the stuff function.  
    

    Output:

    +----------------------+
    |      stuff_list      |
    +----------------------+
    | Fido,Beethoven,Buddy |
    +----------------------+
    

    Finally let’s just mush this into a select statement, noting the reference to the top_query alias defining which column1 we want (on the 5th line here):

    select top_query.column1, 
              (select stuff([list],1,1,'') as stuff_list
             from (select ',' + cast(column2 as varchar(255)) as [text()]
                      from #column_to_list sub
                      where sub.column1 = top_query.column1
                      for xml path('')
                      ) sub_query([list])
                  ) as pet_list
    from  #column_to_list top_query
    group by column1
    order by column1
    

    output:

    +---------+----------------------+
    | column1 |       pet_list       |
    +---------+----------------------+
    | bird    | Tweety               |
    | cat     | Felon,Purz           |
    | dog     | Fido,Beethoven,Buddy |
    +---------+----------------------+
    

    And we’re done.

    You can read more here:

    • FOR XML PATH in SQL server and [text()]
    • https://docs.microsoft.com/en-us/sql/relational-databases/xml/use-path-mode-with-for-xml?view=sql-server-2017
    • https://www.codeproject.com/Articles/691102/String-Aggregation-in-the-World-of-SQL-Server
    0 讨论(0)
  • 2020-12-05 05:53

    Use simplest way of doing this-

    SELECT GROUP_CONCAT(Column) from table
    
    0 讨论(0)
  • 2020-12-05 05:54
    ALTER PROCEDURE [dbo].[spConvertir_CampoACadena]( @nomb_tabla   varchar(30),
                              @campo_tabla  varchar(30),
                              @delimitador  varchar(5),
                              @respuesta    varchar(max) OUTPUT
    )
    AS
    DECLARE @query      varchar(1000),
        @cadena     varchar(500)
    BEGIN
      SET @query = 'SELECT @cadena  = COALESCE(@cadena + '''+ @delimitador +''', '+ '''''' +') + '+ @campo_tabla + ' FROM '+@nomb_tabla
      --select @query
      EXEC(@query)
      SET @respuesta = @cadena  
    END
    
    0 讨论(0)
提交回复
热议问题