STRING_SPLIT(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric Warehouse에 있는 SQL Server 2016(13.x) 이상 Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics SQL 분석 엔드포인트
STRING_SPLIT
는 지정된 구분 기호 문자에 따라 문자열을 부분 문자열 행으로 분할하는 테이블 반환 함수입니다.
호환성 수준 130
STRING_SPLIT
에서는 호환성 수준이 130 이상이어야 합니다. 수준이 130보다 작으면 데이터베이스 엔진 함수를 STRING_SPLIT
찾을 수 없습니다.
데이터베이스의 호환성 수준을 변경하려면 데이터베이스의 호환성 수준 보기 또는 변경을 참조합니다.
참고 항목
Azure Synapse Analytics에서는 호환성 구성이 필요하지 STRING_SPLIT
않습니다.
구문
STRING_SPLIT ( string , separator [ , enable_ordinal ] )
인수
string
모든 문자 형식의 식입니다(예: nvarchar, varchar, nchar 또는 char).
separator
연결된 부분 문자열의 구분 기호로 사용되는 모든 문자 형식(예: nvarchar(1), varchar(1), nchar(1) 또는 char(1))의 단일 문자 식입니다.
enable_ordinal
적용 대상: Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics(서버리스 SQL 풀만 해당) 및 SQL Server 2022(16.x) 이상 버전
ordinal
출력 열을 사용하거나 사용하지 않도록 설정하는 플래그로 사용되는 int 또는 bit 식입니다. 값을 1
사용하면 열이 활성화됩니다 ordinal
. enable_ordinal 생략되거나 NULL
값 ordinal
0
이 있는 경우 열이 비활성화됩니다.
반환 형식
ordinal
출력 열을 사용하도록 설정 STRING_SPLIT
하지 않으면 행이 부분 문자열인 단일 열 테이블을 반환합니다. 열 이름은 value
입니다. 입력 인수가 nvarchar 또는 nchar인 경우 nvarchar를 반환합니다. 그렇지 않으면 varchar를 반환합니다. 반환 형식의 길이는 string 인수의 길이와 동일합니다.
enable_ordinal 인수 값이 전달되면 입력 문자열에서 1
각 부분 문자열 위치의 1부터 시작하는 인덱스 값으로 구성된 두 번째 열 ordinal
이 반환됩니다. 반환 형식은 bigint입니다.
설명
STRING_SPLIT
는 구분 기호로 구분된 부분 문자열을 입력하고 구분 기호 또는 구분 기호로 사용할 한 문자를 입력합니다. 필요에 따라 함수는 값 0
이 있는 세 번째 인수를 지원하거나 1
출력 열을 각각 ordinal
사용하지 않도록 설정하거나 사용하도록 설정합니다.
STRING_SPLIT
는 enable_ordinal 인수에 따라 단일 열 또는 이중 열 테이블을 출력합니다.
enable_ordinal
NULL
생략되었거나 값0
STRING_SPLIT
이 있는 경우 행에 부분 문자열이 포함된 단일 열 테이블을 반환합니다. 출력 열의 이름은value
입니다.enable_ordinal 값
1
이 있는 경우 함수는 원래 입력 문자열에 있는 부분 문자열의 1부터 시작하는 인덱스 값으로 구성된 열을 포함하여ordinal
2열 테이블을 반환합니다.
enable_ordinal 인수는 열이나 변수가 아닌 상수 값이어야 합니다. 값 1
0
이 있는 비트 또는 int 데이터 형식이어야 합니다. 그렇지 않으면 함수에서 오류가 발생합니다.
출력 행은 순서에 관계 없을 수 있습니다. 순서 가 입력 문자열의 부분 문자열 순서와 일치하도록 보장되지 않습니다 . 문에 절을 사용하여 ORDER BY
최종 정렬 순서를 재정의 SELECT
할 ORDER BY ordinal
수 있습니다. 예를 들면 다음과 같습니다ORDER BY value
.
0x0000
(char(0))는 Windows 데이터 정렬에서 정의되지 않은 문자이며 에 포함 STRING_SPLIT
할 수 없습니다.
0 길이의 빈 부분 문자열은 입력 문자열에서 구분 기호 문자 두 개 이상이 연속되는 경우 존재합니다. 빈 부분 문자열은 일반 부분 문자열과 동일한 방식으로 처리됩니다. 예를 들어 WHERE value <> ''
절을 사용하여 빈 부분 문자열이 포함된 행을 필터링할 WHERE
수 있습니다. 입력 문자열이 NULL
STRING_SPLIT
면 테이블 반환 함수는 빈 테이블을 반환합니다.
예를 들어 다음 SELECT
문은 공백 문자를 구분 기호로 사용합니다.
SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');
연습 실행에서 앞 SELECT
의 결과 테이블은 다음과 같이 반환되었습니다.
value |
---|
Lorem |
ipsum |
dolor |
sit |
amet. |
다음 예제에서는 ordinal
선택적 세 번째 인수를 전달 1
하여 열을 사용하도록 설정합니다.
SELECT * FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ', 1);
그러면 이 문은 다음 결과 테이블을 반환합니다.
value | 서수 |
---|---|
Lorem |
1 |
ipsum |
2 |
dolor |
3 |
sit |
4 |
amet. |
5 |
예제
A. CSV(쉼표로 구분된 값) 문자열 분할
쉼표로 구분된 값 목록을 구문 분석하고 비어 있지 않은 토큰을 모두 반환합니다.
DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'
SELECT value
FROM STRING_SPLIT(@tags, ',')
WHERE RTRIM(value) <> '';
STRING_SPLIT
는 구분 기호 사이에 아무것도 없는 경우 빈 문자열을 반환합니다. 조건은 RTRIM(value) <> ''
빈 토큰을 제거합니다.
B. 열에서 CSV(쉼표로 구분된 값) 문자열 분할
제품 테이블에는 다음 예제와 같이 쉼표로 구분된 태그 목록이 포함된 열이 있습니다.
ProductId | 속성 | 태그 |
---|---|---|
1 |
Full-Finger Gloves |
clothing,road,touring,bike |
2 |
LL Headset |
bike |
3 |
HL Mountain Frame |
bike,mountain |
다음 쿼리는 각 태그 목록을 변환하고 원래 행과 결합합니다.
SELECT ProductId, Name, value
FROM Product
CROSS APPLY STRING_SPLIT(Tags, ',');
결과 집합은 다음과 같습니다.
ProductId | 속성 | 값 |
---|---|---|
1 |
Full-Finger Gloves |
clothing |
1 |
Full-Finger Gloves |
road |
1 |
Full-Finger Gloves |
touring |
1 |
Full-Finger Gloves |
bike |
2 |
LL Headset |
bike |
3 |
HL Mountain Frame |
bike |
3 |
HL Mountain Frame |
mountain |
참고 항목
순서가 입력 문자열의 부분 문자열 순서와 일치하도록 보장되지 않으므로 출력 순서가 달라질 수 있습니다.
C. 값 기준 정렬
사용자는 각 태그별 제품의 수를 표시하고 제품 수 기준으로 정렬한 보고서를 생성하여 제품 수가 2 초과인 태그만 필터링해야 합니다.
SELECT value as tag, COUNT(*) AS [number_of_articles]
FROM Product
CROSS APPLY STRING_SPLIT(Tags, ',')
GROUP BY value
HAVING COUNT(*) > 2
ORDER BY COUNT(*) DESC;
D. 태그 값으로 검색
개발자는 키워드를 기준으로 물품을 찾는 쿼리를 만들어야 합니다. 다음과 같은 쿼리를 사용할 수 있습니다.
단일 태그(의복)가 포함된 제품 찾기:
SELECT ProductId, Name, Tags
FROM Product
WHERE 'clothing' IN (SELECT value FROM STRING_SPLIT(Tags, ','));
지정된 태그 2개(의복 및 도로)가 포함된 제품 찾기:
SELECT ProductId, Name, Tags
FROM Product
WHERE EXISTS (SELECT *
FROM STRING_SPLIT(Tags, ',')
WHERE value IN ('clothing', 'road'));
E. 값 목록 기준으로 행 찾기
개발자는 ID 목록을 기준으로 물품을 찾는 쿼리를 만들어야 합니다. 다음과 같은 쿼리를 사용할 수 있습니다.
SELECT ProductId, Name, Tags
FROM Product
JOIN STRING_SPLIT('1,2,3',',')
ON value = ProductId;
앞의 STRING_SPLIT
사용법은 일반적인 안티패턴을 대체합니다. 이러한 안티패턴에는 애플리케이션 계층 또는 Transact-SQL에서 동적 SQL 문자열을 만드는 작업이 포함될 수 있습니다. 또는 연산자를 사용하여 안티패턴을 LIKE
달성할 수 있습니다. 다음 예제 SELECT
문을 참조하세요.
SELECT ProductId, Name, Tags
FROM Product
WHERE ',1,2,3,' LIKE '%,' + CAST(ProductId AS VARCHAR(20)) + ',%';
F. 서수 값으로 행 검색
다음 문은 짝수 인덱스 값을 가진 행을 모두 찾습니다.
SELECT *
FROM STRING_SPLIT('Austin,Texas,Seattle,Washington,Denver,Colorado', ',', 1)
WHERE ordinal % 2 = 0;
위 문은 다음 테이블을 반환합니다.
value | 서수 |
---|---|
텍사스 | 2 |
워싱턴 | 4 |
Colorado | 6 |
G. 서수 값으로 행 정렬
다음 문은 ordinal
열을 기준으로 정렬된 입력 문자열 및 해당 서수 값의 분할 부분 문자열 값을 반환합니다.
SELECT * FROM STRING_SPLIT('E-D-C-B-A', '-', 1) ORDER BY ordinal DESC;
위 문은 다음 테이블을 반환합니다.
value | 서수 |
---|---|
A | 5 |
b | 4 |
C | 3 |
D | 2 |
E | 1 |