>데이터 베이스 >MySQL 튜토리얼 >SQL 열의 구분된 값을 여러 행으로 효율적으로 분할하는 방법은 무엇입니까?

SQL 열의 구분된 값을 여러 행으로 효율적으로 분할하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-01 12:47:11719검색

How to Efficiently Split Delimited Values in a SQL Column into Multiple Rows?

SQL 열의 구분된 값을 여러 행으로 분할

수신자와 같이 단일 열에 구분된 값이 포함된 테이블을 처리할 때 -세미콜론(;)으로 구분된 주소 필드의 경우 추가 처리 또는 분석을 위해 이러한 값을 여러 행으로 분할해야 합니다. 이 문서에서는 특히 성능 및 효율성 최적화에 중점을 두고 SQL을 사용하여 이를 달성하는 다양한 방법을 살펴봅니다.

SQL Server 2016용 STRING_SPLIT 함수 사용

SQL Server를 사용하는 경우 2016 이상에서는 STRING_SPLIT 함수를 활용하여 구분된 값을 효율적으로 분할할 수 있습니다. 이 함수의 구문은 다음과 같습니다.

STRING_SPLIT(@list, @delimiter)

다음은 STRING_SPLIT를 사용하여 수신자 주소를 별도의 행으로 추출하는 방법입니다.

SELECT [message-id], value
FROM dbo.SourceData
CROSS APPLY STRING_SPLIT([recipient-address], ';') AS f;

Pre에 대한 분할 함수 생성 -SQL Server 2016 버전

SQL Server 2016 이전 버전의 경우 2016에서는 사용자 정의 분할 기능을 만들 수 있습니다. 이러한 함수의 한 가지 예는 다음과 같습니다.

CREATE FUNCTION dbo.SplitStrings(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT Number = ROW_NUMBER() OVER (ORDER BY Number),
        Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
        CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id])
        FROM sys.all_objects AS s1 CROSS APPLY sys.all_objects) AS n(Number)
    WHERE Number <= CONVERT(INT, LEN(@List))
        AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
    ) AS y);
GO

이 함수를 사용하여 다음과 같이 구분된 값을 분할할 수 있습니다.

SELECT [message-id], f.Item
FROM dbo.SourceData
CROSS APPLY dbo.SplitStrings([recipient-address], ';') AS f;

최적화 및 고려 사항

최적의 성능을 보장하려면 다음 사항을 고려하세요. 팁:

  • SQL Server 버전에 따라 적절한 방법을 사용하세요.
  • LIKE 연산자를 사용하여 구분 기호를 검색하는 것은 비효율적이므로 피하세요.
  • 더 빠른 조회를 위해 수신자 주소 열을 색인화하세요.
  • 대규모 데이터 세트를 작은 단위로 나누어
  • SQL Server의 대량 삽입 메커니즘을 사용하여 데이터를 데이터베이스로 효율적으로 가져옵니다.

위 내용은 SQL 열의 구분된 값을 여러 행으로 효율적으로 분할하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.