programing

SQL 쿼리 - 결과를 하나의 문자열로 연결

lastmoon 2023. 7. 31. 21:48
반응형

SQL 쿼리 - 결과를 하나의 문자열로 연결

다음 코드를 포함하는 SQL 함수가 있습니다.

DECLARE @CodeNameString varchar(100)

SELECT CodeName FROM AccountCodes ORDER BY Sort

선택 쿼리의 모든 결과를 CodeNameString에 연결해야 합니다.

분명히 C# 코드의 FOREACH 루프가 이를 수행할 것입니다. 하지만 SQL에서는 어떻게 해야 합니까?

이라면 이 SQL Server 2005를 할 수 .FOR XML PATH & STUFF스커트:

DECLARE @CodeNameString varchar(100)

SELECT 
   @CodeNameString = STUFF( (SELECT ',' + CodeName 
                             FROM dbo.AccountCodes 
                             ORDER BY Sort
                             FOR XML PATH('')), 
                            1, 1, '')

FOR XML PATH('')예: " " " XML " " ").,code1,code2,code3및 등) 및STUFF첫 번째 문자에 "아무것도" 문자를 붙이지 않습니다. 예를 들어, "잔여한" 첫 번째 쉼표를 지우는 것과 같이, 원하는 결과를 얻을 수 있습니다.

업데이트: 예 - 설명을 이해합니다 - 데이터베이스 테이블의 텍스트에 이미 다음과 같은 문자가 포함되어 있는 경우<,>또는&그러면 나의 현재 솔루션은 실제로 그것들을 인코딩할 것입니다.&lt;,&gt;,그리고.&amp;.

XML 인코딩에 문제가 있는 경우 @KM에서 제안한 솔루션을 살펴봐야 합니다. 이러한 문자에도 사용할 수 있습니다.한 가지 경고할 것은 이 접근 방식은 리소스와 처리 집약적이라는 것입니다.

DECLARE @CodeNameString varchar(max)
SET @CodeNameString=''

SELECT @CodeNameString=@CodeNameString+CodeName FROM AccountCodes ORDER BY Sort
SELECT @CodeNameString

@@mp null하는 것도 고려해볼coalesce:

declare @CodeNameString  nvarchar(max)
set @CodeNameString = null
SELECT @CodeNameString = Coalesce(@CodeNameString + ', ', '') + cast(CodeName as varchar) from AccountCodes  
select @CodeNameString

SQL Server 2005 이상의 경우 다음을 위해 병합 사용nulls캐스트 또는 변환을 사용하고 있습니다.numeric values-

declare @CodeNameString  nvarchar(max)
select  @CodeNameString = COALESCE(@CodeNameString + ',', '')  + Cast(CodeName as varchar) from AccountCodes  ORDER BY Sort
select  @CodeNameString

from msdn SELECT 문에서 변수를 사용하여 값을 연결하지 마십시오(즉, 집계 값을 계산함).예기치 않은 쿼리 결과가 발생할 수 있습니다.이는 SELECT 목록(할당 포함)의 모든 식이 각 출력 행에 대해 정확히 한 번만 실행되는 것이 보장되지 않기 때문입니다.

위의 내용은 위와 같은 연결이 유효하지 않다고 말하는 것 같습니다. 할당이 선택에 의해 반환된 행 수보다 더 많이 수행될 수 있기 때문입니다.

다음은 2008년 릴리스(이후)와 함께 사용할 수 있는 또 다른 실제 사례입니다.

이것은 단순을 사용하는 원래 쿼리입니다.max()값을 .

SELECT option_name, Field_M3_name, max(Option_value) AS "Option value", max(Sorting) AS "Sorted"
FROM Value_list group by Option_name, Field_M3_name
ORDER BY option_name, Field_M3_name

개선된 버전. 주요 개선점은 모든 값을 쉼표로 구분하여 표시하는 것입니다.

SELECT from1.keys, from1.option_name, from1.Field_M3_name,

 Stuff((SELECT DISTINCT ', ' + [Option_value] FROM Value_list from2
  WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Option values",

 Stuff((SELECT DISTINCT ', ' + CAST([Sorting] AS VARCHAR) FROM Value_list from2
  WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Sorting"

FROM ((SELECT DISTINCT COALESCE(Option_name,'') + '|' + COALESCE(Field_M3_name,'') AS keys, Option_name, Field_M3_name FROM Value_list)
-- WHERE
) from1
ORDER BY keys

우리는 가능한 모든 것을 해결했습니다.NULL제가 생각할 수 있는 사례 문제와 숫자 값(필드 정렬)에 대해 발생한 오류를 수정했습니다.

언급URL : https://stackoverflow.com/questions/5196371/sql-query-concatenating-results-into-one-string

반응형