복붙노트

[SQL] SQL Server는 열을 선택 변환 문자열로 변환

SQL

SQL Server는 열을 선택 변환 문자열로 변환

이 테이블에서 열을 선택하고 문자열로 결과를 변환하는 명령문을 작성 할 수 있습니까?

이상적으로는 쉼표로 구분 된 값을 할 것입니다.

예를 들어, SELECT 문이 같이 보입니다 말

SELECT column
FROM table
WHERE column<10

그 결과는 값 열인

|column|
--------
|  1   |
|  3   |
|  5   |
|  9   |

나는 결과 문자열 "1, 3, 5, 9"로 원하는

해결법

  1. ==============================

    1.당신은 이런 식으로 작업을 수행 할 수 있습니다 :

    당신은 이런 식으로 작업을 수행 할 수 있습니다 :

    바이올린 데모

    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 |
    
  2. ==============================

    2.

    select  stuff(list,1,1,'')
    from    (
            select  ',' + cast(col1 as varchar(16)) as [text()]
            from    YourTable
            for     xml path('')
            ) as Sub(list)
    

    SQL 바이올린의 예.

  3. ==============================

    3.SQL 서버 2017의 새로운 방법이있다 :

    SQL 서버 2017의 새로운 방법이있다 :

    SELECT STRING_AGG 테이블 AS 컬럼 (컬럼 '');

    당신을 위해 1,3,5,9를 생산하는 것

  4. ==============================

    4.

    SELECT  CAST(<COLUMN Name> AS VARCHAR(3)) + ','
    FROM    <TABLE Name>
    FOR     XML PATH('')
    
  5. ==============================

    5.현재 허용 대답은 여러 그룹이 작동하지 않습니다. 당신이 열 행 값의 범주에서 작동 할 때이보십시오.

    현재 허용 대답은 여러 그룹이 작동하지 않습니다. 당신이 열 행 값의 범주에서 작동 할 때이보십시오.

    나는 다음과 같은 데이터가 있다고 가정 :

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

    그리고 난 내 출력으로이 원하는 :

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

    (당신이 함께 다음과 같은 경우 :

    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')
    

    )

    - 지금 나는 모든 구문에 가고 싶지 않아,하지만 당신이 볼 수 있듯이, 이것은 우리에 대한 초기 트릭을 수행합니다

    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
    

    산출:

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

    당신은 제한있어 볼 수는 그룹화 한에 대한 것을 (여기서, 컬럼 = '개')과는 앞에 쉼표를 떠났고, 또한 그것이 이상한 이름입니다.

    그래서, 처음의이 '물건'기능을 사용하여 최고의 쉼표를 처리하고 우리의 열 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.  
    

    산출:

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

    마지막으로 그냥 (여기에 5 번째 줄에) 우리가 원하는, 컬럼 정의 top_query 별칭에 대한 참조를 지적 select 문에이 개 썰매의하자 :

    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
    

    산출:

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

    그리고 우리는 완료됩니다.

    당신은 자세한 내용은 여기를 읽을 수 있습니다 :

  6. ==============================

    6.쉼표 재사용 열 생성에 이것을 자상 문자열을 분리 하였다. 이 경우, 값이 나는 빈 문자열 또는 null을 원하지 않는 내가 하나의 문자열.

    쉼표 재사용 열 생성에 이것을 자상 문자열을 분리 하였다. 이 경우, 값이 나는 빈 문자열 또는 null을 원하지 않는 내가 하나의 문자열.

    우선은 한 컬럼 테이블 사용자 정의 형식을 만들 수 있습니다.

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

    타입의 실제 목적은 쉼표로 구분 된 값으로 컬럼을 넣어 스칼라 함수를 생성 단순화하는 것이다.

    -- ================================================
    -- 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
    

    자,이를 사용할 수 있습니다. 나는 쉼표로 변환 할 열이 SingleVarcharColumn 형식으로 문자열을 분리 선택합니다.

    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)
    

    이 같은 결과를 얻을 수 있습니다.

    강탈, 폴, 제임스, 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

    나는 성능에 손상을 줄 수 있습니다 내 SingleVarcharColumn 유형 NVARCHAR (MAX)에서 내 데이터 열을했다,하지만 유연성은 내가 찾던 그것이 내 목적을 위해 충분히 빨리 실행 것이었다. 그것은 VARCHAR 인 경우에 아마 빠른 것하고 고정 된 작은 폭을했지만, 경우에 나는 그것을 테스트하지 않았습니다.

  7. ==============================

    7.

    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
    
  8. ==============================

    8.다음과 같은 방법을 사용할 수 있습니다 :

    다음과 같은 방법을 사용할 수 있습니다 :

    select
    STUFF(
            (
            select ', ' + CONVERT(varchar(10), ID) FROM @temp
            where ID<50
    group by ID for xml path('')
            ), 1, 2, '') as IDs
    
    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
    

  9. ==============================

    9.this- 수행하는 간단한 방법을 사용하여

    this- 수행하는 간단한 방법을 사용하여

    SELECT GROUP_CONCAT(Column) from table
    
  10. ==============================

    10.사용 LISTAGG 기능, 전의. TABLE_NAME FROM SELECT LISTAGG (colmn);

    사용 LISTAGG 기능, 전의. TABLE_NAME FROM SELECT LISTAGG (colmn);

  11. from https://stackoverflow.com/questions/16193152/sql-server-convert-select-a-column-and-convert-it-to-a-string by cc-by-sa and MIT license