STRING_SPLIT(Transact-SQL)STRING_SPLIT (Transact-SQL)

적용 대상: 예SQL Server 2016 이상 예Azure SQL Database 예Azure Synapse Analytics(SQL DW) 아니요병렬 데이터 웨어하우스 APPLIES TO: YesSQL Server 2016 and later YesAzure SQL Database YesAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

지정된 구분 기호 문자에 따라 문자열을 부분 문자열의 행으로 분할하는 테이블 반환 함수입니다.A table-valued function that splits a string into rows of substrings, based on a specified separator character.

호환성 수준 130Compatibility level 130

STRING_SPLIT에는 130 이상의 호환성 수준이 필요합니다.STRING_SPLIT requires the compatibility level to be at least 130. 130 미만 수준인 경우 SQL Server는 STRING_SPLIT 함수를 찾을 수 없습니다.When the level is less than 130, SQL Server is unable to find the STRING_SPLIT function.

데이터베이스의 호환성 수준을 변경하려면 데이터베이스의 호환성 수준 보기 또는 변경을 참조합니다.To change the compatibility level of a database, refer to View or Change the Compatibility Level of a Database.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

STRING_SPLIT ( string , separator )  

참고

SQL Server 2014 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

인수Arguments

stringstring
모든 문자 형식(예: nvarchar, varchar, nchar 또는 char)의 입니다.Is an expression of any character type (for example, nvarchar, varchar, nchar, or char).

separatorseparator
연결된 부분 문자열의 구분 기호로 사용되는 모든 문자 형식(예: nvarchar(1) , varchar(1) , nchar(1) 또는 char(1) )의 단일 문자 입니다.Is a single character expression of any character type (for example, nvarchar(1), varchar(1), nchar(1), or char(1)) that is used as separator for concatenated substrings.

반환 형식Return Types

부분 문자열인 행의 단일 열 테이블을 반환합니다.Returns a single-column table whose rows are the substrings. 열의 이름은 value입니다.The name of the column is value. 입력 조각이 nvarchar 또는 nchar인 경우 nvarchar를 반환합니다.Returns nvarchar if any of the input arguments are either nvarchar or nchar. 그렇지 않으면 varchar를 반환합니다.Otherwise returns varchar. 반환 형식의 길이는 문자열 인수의 길이와 동일합니다.The length of the return type is the same as the length of the string argument.

설명Remarks

STRING_SPLIT는 부분 문자열을 구분 기호로 분리한 문자열을 입력하고 구분 기호로 사용될 문자 하나를 입력합니다.STRING_SPLIT inputs a string that has delimited substrings, and inputs one character to use as the delimiter or separator. STRING_SPLIT는 부분 문자열이 포함된 행의 단일 열 테이블을 출력합니다.STRING_SPLIT outputs a single-column table whose rows contain the substrings. 출력 열의 이름은 value입니다.The name of the output column is value.

출력 행은 순서에 관계 없을 수 있습니다.The output rows might be in any order. 순서가 입력 문자열의 부분 문자열 순서와 일치하지 않을 수 있습니다.The order is not guaranteed to match the order of the substrings in the input string. SELECT 문(ORDER BY value)에서 ORDER BY 절을 사용하여 최종 정렬 순서를 재정의할 수 있습니다.You can override the final sort order by using an ORDER BY clause on the SELECT statement (ORDER BY value).

0x0000(char(0) )은 Windows 데이터 정렬에서 정의되지 않은 문자이며 STRING_SPLIT에 포함할 수 없습니다.0x0000 (char(0)) is an undefined character in Windows collations and cannot be included in STRING_SPLIT.

0 길이의 빈 부분 문자열은 입력 문자열에서 구분 기호 문자 두 개 이상이 연속되는 경우 존재합니다.Empty zero-length substrings are present when the input string contains two or more consecutive occurrences of the delimiter character. 빈 부분 문자열은 일반 부분 문자열과 동일한 방식으로 처리됩니다.Empty substrings are treated the same as are plain substrings. WHERE 절(WHERE value <> '')을 사용하여 빈 부분 문자열을 포함하는 모든 행을 필터링할 수 있습니다.You can filter out any rows that contain the empty substring by using the WHERE clause (WHERE value <> ''). 입력 문자열이 NULL인 경우 STRING_SPLIT 테이블 반환 함수는 빈 테이블을 반환합니다.If the input string is NULL, the STRING_SPLIT table-valued function returns an empty table.

예를 들어 다음 SELECT 문은 구분 기호로 공백 문자를 사용합니다.As an example, the following SELECT statement uses the space character as the separator:

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

실제 실행에서 앞의 SELECT 문은 다음과 같은 결과 테이블을 반환했습니다.In a practice run, the preceding SELECT returned following result table:

value
LoremLorem
ipsumipsum
dolordolor
sitsit
amet.amet.
 

Examples

A.A. CSV(쉼표로 구분된 값) 문자열 분할Split comma-separated value string

쉼표로 구분된 값 목록을 구문 분석하고 비어 있지 않은 토큰을 모두 반환합니다.Parse a comma-separated list of values and return all non-empty tokens:

DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'  
  
SELECT value  
FROM STRING_SPLIT(@tags, ',')  
WHERE RTRIM(value) <> '';

구분 기호 사이에 아무 것도 없을 경우 STRING_SPLIT은 빈 문자열을 반환합니다.STRING_SPLIT will return empty string if there is nothing between separator. RTRIM(value) <> ''조건은 빈 토큰을 제거합니다.Condition RTRIM(value) <> '' will remove empty tokens.

B.B. 열에서 CSV(쉼표로 구분된 값) 문자열 분할Split comma-separated value string in a column

제품 테이블에는 다음 예제와 같이 쉼표로 구분된 태그 목록이 포함된 열이 있습니다.Product table has a column with comma-separate list of tags shown in the following example:

ProductIdProductId 속성Name 태그들Tags
11 Full-Finger GlovesFull-Finger Gloves clothing,road,touring,bikeclothing,road,touring,bike
22 LL HeadsetLL Headset bikebike
33 HL Mountain FrameHL Mountain Frame bike,mountainbike,mountain

다음 쿼리는 각 태그 목록을 변환하고 원래 행과 결합합니다.Following query transforms each list of tags and joins them with the original row:

SELECT ProductId, Name, value  
FROM Product  
    CROSS APPLY STRING_SPLIT(Tags, ',');  

결과 집합은 다음과 같습니다.Here is the result set.

ProductIdProductId 속성Name value
11 Full-Finger GlovesFull-Finger Gloves clothingclothing
11 Full-Finger GlovesFull-Finger Gloves 도로road
11 Full-Finger GlovesFull-Finger Gloves touringtouring
11 Full-Finger GlovesFull-Finger Gloves bikebike
22 LL HeadsetLL Headset bikebike
33 HL Mountain FrameHL Mountain Frame bikebike
33 HL Mountain FrameHL Mountain Frame mountainmountain

참고

출력 순서는 입력 문자열의 하위 문자열 순서와 일치하지 않을 수 있으므로 순서가 달라질 수 있습니다.The order of the output may vary as the order is not guaranteed to match the order of the substrings in the input string.

C.C. 값 기준 정렬Aggregation by values

사용자는 각 태그별 제품의 수를 표시하고 제품 수 기준으로 정렬한 보고서를 생성하여 제품 수가 2 초과인 태그만 필터링해야 합니다.Users must create a report that shows the number of products per each tag, ordered by number of products, and to filter only the tags with more than two products.

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.D. 태그 값으로 검색Search by tag value

개발자는 키워드를 기준으로 물품을 찾는 쿼리를 만들어야 합니다.Developers must create queries that find articles by keywords. 다음과 같은 쿼리를 사용할 수 있습니다.They can use following queries:

단일 태그(의복)가 포함된 제품 찾기:To find products with a single tag (clothing):

SELECT ProductId, Name, Tags  
FROM Product  
WHERE 'clothing' IN (SELECT value FROM STRING_SPLIT(Tags, ','));  

지정된 태그 2개(의복 및 도로)가 포함된 제품 찾기:Find products with two specified tags (clothing and road):

SELECT ProductId, Name, Tags  
FROM Product  
WHERE EXISTS (SELECT *  
    FROM STRING_SPLIT(Tags, ',')  
    WHERE value IN ('clothing', 'road'));  

E.E. 값 목록 기준으로 행 찾기Find rows by list of values

개발자는 ID 목록을 기준으로 물품을 찾는 쿼리를 만들어야 합니다.Developers must create a query that finds articles by a list of IDs. 다음과 같은 쿼리를 사용할 수 있습니다.They can use following query:

SELECT ProductId, Name, Tags  
FROM Product  
JOIN STRING_SPLIT('1,2,3',',')
    ON value = ProductId;  

이전 STRING_SPLIT 사용이 일반적인 안티패턴을 대체합니다.The preceding STRING_SPLIT usage is a replacement for a common anti-pattern. 이러한 안티패턴은 TRANSACT-SQL 또는 애플리케이션 계층에서 동적 SQL 문자열을 생성할 수 있습니다.Such an anti-pattern can involve the creation of a dynamic SQL string in the application layer or in Transact-SQL. 또는 LIKE 연산자를 사용하여 안티패턴을 구현할 수 있습니다.Or an anti-pattern can be achieved by using the LIKE operator. 다음 SELECT 문 예제를 참조하세요.See the following example SELECT statement:

SELECT ProductId, Name, Tags  
FROM Product  
WHERE ',1,2,3,' LIKE '%,' + CAST(ProductId AS VARCHAR(20)) + ',%';  

참고 항목See Also