programing

SQL Server 결과 집합을 문자열로 변환

goodsources 2023. 7. 15. 10:04
반응형

SQL Server 결과 집합을 문자열로 변환

SQL Server에서 다음과 같은 결과를 얻고 있습니다.

SELECT StudentId FROM Student WHERE condition = xyz

저는 다음과 같은 출력을 받고 있습니다.

학생 ID1236
7656
8990........

저장 프로시저의 출력 파라미터는 다음과 같습니다.@studentIdstring and I want the return statement as

1236, 7656, 8990.

출력을 단일 문자열로 변환하려면 어떻게 해야 합니까?

단일 열을 반환합니다.학생 ID]

테스트:

 DECLARE @result NVARCHAR(MAX)

 SELECT @result = STUFF(
                        (   SELECT ',' + CONVERT(NVARCHAR(20), StudentId) 
                            FROM Student 
                            WHERE condition = abc 
                            FOR xml path('')
                        )
                        , 1
                        , 1
                        , '')
DECLARE @result varchar(1000)

SELECT @result = ISNULL(@result, '') + StudentId + ',' FROM Student WHERE condition = xyz

select substring(@result, 0, len(@result) - 1) --trim extra "," at end

사용COALESCE함수:

DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = COALESCE(@StudentID + ',', '') + StudentID
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID

두 대답 모두 유효하지만 변수 값을 초기화하는 것을 잊지 마십시오. 기본값은 NULL이고 T-SQL입니다.

NULL + "Any text" => NULL

그것은 매우 흔한 실수입니다, 잊지 마세요!

ISNULL 기능을 사용하는 것도 좋습니다.

SELECT @result = @result + ISNULL(StudentId + ',', '') FROM Student

사용CONCAT변환 오류를 방지하는 기능:

DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = CONCAT(COALESCE(@StudentID + ',', ''), StudentID)
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID

다음은 MySQL(SQL Server가 아님)을 위한 솔루션입니다. mysql에 대한 스택 오버플로에 대한 솔루션을 쉽게 찾을 수 없었기 때문에 누군가에게 도움이 될 수 있다고 생각했습니다.

참조: https://forums.mysql.com/read.php?10,285268,285286#msg-285286

원래 쿼리...

SELECT StudentId FROM Student WHERE condition = xyz

원래 결과 집합...

StudentId
1236
7656
8990

새 쿼리(concat...)

SELECT group_concat(concat_ws(',', StudentId) separator '; ') 
FROM Student 
WHERE condition = xyz

concat 문자열 결과 집합

StudentId
1236; 7656; 8990

참고: '분리자'를 원하는 대로 변경합니다.

GLHF!

이 값은 테이블의 NULL 값과 함께 작동하며 마지막에 하위 문자열 연산이 필요하지 않습니다. COALESCE는 테이블의 NULL 값과 잘 작동하지 않습니다(있는 경우).

DECLARE @results VARCHAR(1000) = '' 
SELECT @results = @results + 
           ISNULL(CASE WHEN LEN(@results) = 0 THEN '' ELSE ',' END + [StudentId], '')
FROM Student WHERE condition = xyz

select @results

brad.v이 틀렸습니다!연결된 문자열은 제공되지 않습니다.

여기 브래드처럼 정확한 코드가 있습니다.하지만 한 가지 중요한 변경 사항이 있습니다.

DECLARE @results VarChar(1000)
  SELECT @results = CASE
     WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
     ELSE @results + ', ' + CONVERT( VarChar(20), [StudentId])
  END
FROM Student WHERE condition = abc;

차이가 보이나요?:) brad.v 답변을 수정해주세요, 저는 여기서 제 평판이 0이기 때문에 그것을 수정하거나 논평할 수 없습니다.당신이 당신 것을 고친 후에 제 것을 제거할 수 있을 것 같습니다.감사합니다!

STRING_AGG 사용:

SELECT STRING_AGG(sub.StudentId, ',') FROM  
(select * from dbo.Students where Name = 'Test3') as sub

예를 들어 ORDER BY를 사용하려는 경우:

SELECT STRING_AGG(sub.StudentId, ',') WITHIN GROUP(Order by StudentId) FROM  
(select * from dbo.Students where Name = 'Test3') as sub

또는 단일 선택 문...

DECLARE @results VarChar(1000)
SELECT @results = CASE
     WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
     ELSE ', ' + CONVERT( VarChar(20), [StudentId])
   END
FROM Student WHERE condition = abc;

변수를 선언할 때 값을 할당합니다.

DECLARE @result VARCHAR(1000) ='';

SELECT @result = CAST(StudentId AS VARCHAR) + ',' FROM Student WHERE condition = xyz

언급URL : https://stackoverflow.com/questions/4819412/convert-sql-server-result-set-into-string

반응형