STRING_SPLIT(Transact-SQL)

적용 대상:yesSQL Server 2016(13.x) 이상 YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics

지정된 구분 기호 문자에 따라 문자열을 부분 문자열의 행으로 분할하는 테이블 반환 함수입니다.

호환성 수준 130

STRING_SPLIT에는 130 이상의 호환성 수준이 필요합니다. 130 미만 수준인 경우 SQL Server는 STRING_SPLIT 함수를 찾을 수 없습니다.

데이터베이스의 호환성 수준을 변경하려면 데이터베이스의 호환성 수준 보기 또는 변경을 참조합니다.

참고

Azure Synapse Analytics의 STRING_SPLIT에는 호환성 구성이 필요하지 않습니다.

Topic link iconTransact-SQL 구문 규칙

구문

STRING_SPLIT ( string , separator [ , enable_ordinal ] )  

인수

string

모든 문자 형식(예: nvarchar, varchar, nchar 또는 char)의 입니다.

separator

연결된 부분 문자열의 구분 기호로 사용되는 모든 문자 형식(예: nvarchar(1) , varchar(1) , nchar(1) 또는 char(1) )의 단일 문자 입니다.

enable_ordinal

ordinal 출력 열을 사용하거나 사용하지 않도록 설정하는 플래그로 사용되는 int 또는 bit입니다. 값 1은 ordinal 열을 사용하도록 설정합니다. enable_ordinal이 생략되거나 NULL이거나 값이 0이면 ordinal 열이 비활성화됩니다.

참고

enable_ordinal 인수 및 ordinal 출력 열은 현재 Azure SQL Database, Azure SQL Managed Instance 및 Azure Synapse Analytics(서버리스 SQL 풀에만 해당)에서 지원됩니다. SQL Server 2022(16.x) 미리 보기부터 SQL Server에서 인수 및 출력 열을 사용할 수 있습니다.

반환 형식

ordinal 출력 열을 사용하지 않도록 설정한 경우 STRING_SPLIT은 행이 부분 문자열인 단일 열 테이블을 반환합니다. 열 이름은 value입니다. 입력 인수가 nvarchar 또는 nchar인 경우 nvarchar를 반환합니다. 그렇지 않으면 varchar를 반환합니다. 반환 형식의 길이는 string 인수의 길이와 동일합니다.

enable_ordinal 인수에 값 1이 전달되면 입력 문자열에 있는 각 부분 문자열 위치의 1부터 시작하는 인덱스 값으로 구성된 ordinal이라는 두 번째 열이 반환됩니다. 반환 형식은 bigint입니다.

설명

STRING_SPLIT은 부분 문자열을 구분 기호로 분리한 문자열을 입력하고, 구분 기호로 사용할 문자 하나를 입력합니다. 필요에 따라 함수는 각각 ordinal 출력 열을 사용하지 않거나 사용하도록 설정하는 0 또는 1 값이 있는 세 번째 인수를 지원합니다.

STRING_SPLIT은 enable_ordinal 인수에 따라 단일 열 또는 이중 열 테이블을 출력합니다.

  • enable_ordinalNULL이거나 생략되거나 값이 0이면 STRING_SPLIT은 행에 부분 문자열이 포함된 단일 열 테이블을 반환합니다. 출력 열의 이름은 value입니다.

  • enable_ordinal 값이 1이면 함수는 원래 입력 문자열에 있는 부분 문자열의 1부터 시작하는 인덱스 값으로 구성된 ordinal 열이 포함된 2열 테이블을 반환합니다.

enable_ordinal 인수는 열이나 변수가 아닌 상수 값이어야 합니다. 또한 값이 0 또는 1인 bit 또는 int 데이터 형식이어야 합니다. 그렇지 않으면 함수에서 오류가 발생합니다.

출력 행은 순서에 관계 없을 수 있습니다. 순서가 입력 문자열의 부분 문자열 순서와 일치하지 않을 수 있습니다. SELECT 문에서 ORDER BY 절을 사용하여 최종 정렬 순서를 재정의할 수 있습니다(예: ORDER BY value 또는 ORDER BY ordinal).

0x0000(char(0) )은 Windows 데이터 정렬에서 정의되지 않은 문자이며 STRING_SPLIT에 포함할 수 없습니다.

0 길이의 빈 부분 문자열은 입력 문자열에서 구분 기호 문자 두 개 이상이 연속되는 경우 존재합니다. 빈 부분 문자열은 일반 부분 문자열과 동일한 방식으로 처리됩니다. WHERE 절을 사용하여 빈 부분 문자열을 포함하는 모든 행을 필터링할 수 있습니다(예: WHERE value <> ''). 입력 문자열이 NULL인 경우 STRING_SPLIT 테이블 반환 함수는 빈 테이블을 반환합니다.

예를 들어 다음 SELECT 문은 구분 기호로 공백 문자를 사용합니다.

SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');

실제 실행에서 앞의 SELECT 문은 다음과 같은 결과 테이블을 반환했습니다.

value
Lorem
ipsum
dolor
sit
amet.

다음 예제에서는 세 번째 인수(선택 사항)에 1을 전달하여 ordinal 열을 사용하도록 설정합니다.

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 이름 value
1 Full-Finger Gloves clothing
1 Full-Finger Gloves 도로
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

다음 단계