[SQL] SQL Server는 열을 선택 변환 문자열로 변환
SQLSQL Server는 열을 선택 변환 문자열로 변환
이 테이블에서 열을 선택하고 문자열로 결과를 변환하는 명령문을 작성 할 수 있습니까?
이상적으로는 쉼표로 구분 된 값을 할 것입니다.
예를 들어, SELECT 문이 같이 보입니다 말
SELECT column
FROM table
WHERE column<10
그 결과는 값 열인
|column|
--------
| 1 |
| 3 |
| 5 |
| 9 |
나는 결과 문자열 "1, 3, 5, 9"로 원하는
해결법
-
==============================
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.
select stuff(list,1,1,'') from ( select ',' + cast(col1 as varchar(16)) as [text()] from YourTable for xml path('') ) as Sub(list)
SQL 바이올린의 예.
-
==============================
3.SQL 서버 2017의 새로운 방법이있다 :
SQL 서버 2017의 새로운 방법이있다 :
SELECT STRING_AGG 테이블 AS 컬럼 (컬럼 '');
당신을 위해 1,3,5,9를 생산하는 것
-
==============================
4.
SELECT CAST(<COLUMN Name> AS VARCHAR(3)) + ',' FROM <TABLE Name> FOR XML PATH('')
-
==============================
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.쉼표 재사용 열 생성에 이것을 자상 문자열을 분리 하였다. 이 경우, 값이 나는 빈 문자열 또는 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.
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.다음과 같은 방법을 사용할 수 있습니다 :
다음과 같은 방법을 사용할 수 있습니다 :
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.this- 수행하는 간단한 방법을 사용하여
this- 수행하는 간단한 방법을 사용하여
SELECT GROUP_CONCAT(Column) from table
-
==============================
10.사용 LISTAGG 기능, 전의. TABLE_NAME FROM SELECT LISTAGG (colmn);
사용 LISTAGG 기능, 전의. TABLE_NAME FROM SELECT LISTAGG (colmn);
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
'SQL' 카테고리의 다른 글
[SQL] 대신 NULL의 어떻게 SELECT 문 SQL과 결과에 '0'표시합니까? (0) | 2020.06.29 |
---|---|
[SQL] 왼쪽에 방지 중복 값 가입 (0) | 2020.06.29 |
[SQL] 각각의 행에 대해 '어디에'조항 여러 여러 행을 업데이트 (0) | 2020.06.28 |
[SQL] 가져 오기 데이터는 두 날짜 사이에 게시 (0) | 2020.06.28 |
[SQL] 오류 : mysqlnd 이전 불안 인증을 사용하여 4.1 MySQL로 연결할 수 없습니다 (0) | 2020.06.28 |