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

前端 未结 10 467
礼貌的吻别
礼貌的吻别 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:32

    You can use the following method:

    select
    STUFF(
            (
            select ', ' + CONVERT(varchar(10), ID) FROM @temp
            where ID<50
    group by ID for xml path('')
            ), 1, 2, '') as IDs
    

    Implementation:

    Declare @temp Table(
    ID int
    )
    insert into @temp
    (ID)
    values
    (1)
    insert into @temp
    (ID)
    values
    (3)
    insert into @temp
    (ID)
    values
    (5)
    insert into @temp
    (ID)
    values
    (9)
    
     select
    STUFF(
            (
            select ', ' + CONVERT(varchar(10), ID) FROM @temp
            where ID<50
    group by ID for xml path('')
            ), 1, 2, '') as IDs
    

    Result will be:

    0 讨论(0)
  • 2020-12-05 05:34

    There is new method in SQL Server 2017:

    SELECT STRING_AGG (column, ',') AS column FROM Table;

    that will produce 1,3,5,9 for you

    0 讨论(0)
  • 2020-12-05 05:40

    This a stab at creating a reusable column to comma separated string. In this case, I only one strings that have values and I do not want empty strings or nulls.

    First I create a user defined type that is a one column table.

    -- ================================
    -- Create User-defined Table Type
    -- ================================
    USE [RSINET.MVC]
    GO
    
    -- Create the data type
    CREATE TYPE [dbo].[SingleVarcharColumn] AS TABLE 
    (
        data NVARCHAR(max)
    )
    GO
    

    The real purpose of the type is to simplify creating a scalar function to put the column into comma separated values.

    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Scalar Function (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:  Rob Peterson        
    -- Create date: 8-26-2015
    -- Description: This will take a single varchar column and convert it to
    -- comma separated values.
    -- =============================================
    CREATE FUNCTION fnGetCommaSeparatedString 
    (
        -- Add the parameters for the function here
        @column AS [dbo].[SingleVarcharColumn] READONLY
    )
    RETURNS VARCHAR(max)
    AS
    BEGIN
    -- Declare the return variable here
    DECLARE @result VARCHAR(MAX)
    DECLARE @current VARCHAR(MAX)
    DECLARE @counter INT
    DECLARE @c CURSOR
    
    SET @result = ''
    SET @counter = 0
    -- Add the T-SQL statements to compute the return value here
    SET @c = CURSOR FAST_FORWARD
        FOR SELECT COALESCE(data,'') FROM @column
        OPEN @c
        FETCH NEXT FROM @c
        INTO @current
        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF @result <> '' AND @current <> '' SET @result = @result + ',' + @current
            IF @result = '' AND @current <> '' SET @result = @current
        FETCH NEXT FROM @c
        INTO @current
        END
        CLOSE @c
        DEALLOCATE @c
    -- Return the result of the function
    RETURN @result
    
    END
    GO
    

    Now, to use this. I select the column I want to convert to a comma separated string into the SingleVarcharColumn Type.

    DECLARE @s as SingleVarcharColumn
    
    INSERT INTO @s VALUES ('rob')
    INSERT INTO @s VALUES ('paul')
    INSERT INTO @s VALUES ('james')
    INSERT INTO @s VALUES (null)
    
    
    INSERT INTO @s
    SELECT iClientID FROM [dbo].tClient
    
    SELECT [dbo].fnGetCommaSeparatedString(@s)
    

    To get results like this.

    rob,paul,james,1,9,10,11,12,13,14,15,16,18,19,23,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,44,45,46,47,48,49,50,52,53,54,56,57,59,60,61,62,63,64,65,66,67,68,69,70,71,72,74,75,76,77,78,81,82,83,84,87,88,90,91,92,93,94,98,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,129,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159

    I made my data column in my SingleVarcharColumn type an NVARCHAR(MAX) which may hurt performance, but I flexibility was what I was looking for and it runs fast enough for my purposes. It would probably be faster if it were a varchar and if it had a fixed and smaller width, but I have not tested it.

    0 讨论(0)
  • 2020-12-05 05:47
    select  stuff(list,1,1,'')
    from    (
            select  ',' + cast(col1 as varchar(16)) as [text()]
            from    YourTable
            for     xml path('')
            ) as Sub(list)
    

    Example at SQL Fiddle.

    0 讨论(0)
  • 2020-12-05 05:51

    Use LISTAGG function, ex. SELECT LISTAGG(colmn) FROM table_name;

    0 讨论(0)
  • 2020-12-05 05:52

    You can do it like this:

    Fiddle demo

    declare @results varchar(500)
    
    select @results = coalesce(@results + ',', '') +  convert(varchar(12),col)
    from t
    order by col
    
    select @results as results
    
    | RESULTS |
    -----------
    | 1,3,5,9 |
    
    0 讨论(0)
提交回复
热议问题