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첫 번째 문자에 "아무것도" 문자를 붙이지 않습니다. 예를 들어, "잔여한" 첫 번째 쉼표를 지우는 것과 같이, 원하는 결과를 얻을 수 있습니다.
업데이트: 예 - 설명을 이해합니다 - 데이터베이스 테이블의 텍스트에 이미 다음과 같은 문자가 포함되어 있는 경우<,>또는&그러면 나의 현재 솔루션은 실제로 그것들을 인코딩할 것입니다.<,>,그리고.&.
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
'programing' 카테고리의 다른 글
| Angular 2에서 상대 경로가 매우 긴 수입을 피하는 방법은 무엇입니까? (0) | 2023.07.31 |
|---|---|
| web.config에서 디버그가 활성화되었는지 확인하려면 어떻게 해야 합니까? (0) | 2023.07.31 |
| 콘다 환경에서 사이트 패키지는 어디에 있습니까? (0) | 2023.07.31 |
| 타자기의 문자열에서 공백을 제거하는 방법은 무엇입니까? (0) | 2023.07.31 |
| 자바.java.java잘못된 상태 예외: CDATA 태그가 중첩되지 않을 수 있습니다. (0) | 2023.07.31 |