Fabric Data Warehouse에서 정규 표현식 함수 사용

적용 대상:✅ Microsoft Fabric의 SQL 분석 엔드포인트 및 데이터 창고

정규 표현식(regex) 함수는 복잡한 텍스트 패턴을 맞추고 T-SQL 쿼리에서 문자열 데이터를 직접 조작할 수 있게 해줍니다. 이를 사용해 형식을 검증하고, 반구조화된 텍스트에서 값을 추출하며, 패턴 발생 횟수를 세고, 데이터를 창고 밖으로 옮기지 않고 정리하거나 마스킹할 수 있습니다.

참고

정규 표현식은 현재 미리보기 단계입니다.

웨어하우스와 SQL 분석 엔드포인트는 스칼라 정규 표현식 함수를 지원합니다. 각 함수는 입력 행당 하나의 값을 반환하므로 WHERE 목록, CASE, ORDER BY, GROUP BY, JOIN 및 SELECT 식에서 사용할 수 있습니다.

참고

Warehouse에서는 스칼라 정규 표현식 함수만 제공됩니다. 테이블 값 함수 REGEXP_MATCHES 와 REGEXP_SPLIT_TO_TABLE 은 지원되지 않습니다.

지원되는 함수

Function 반환 형식 Description
REGEXP_LIKE Boolean 텍스트 입력이 정규 표현식 패턴과 일치하는지 여부를 나타냅니다. 예를 들어 CASE 절이나 WHERE 표현식에서 술어로 사용하세요.
REGEXP_REPLACE 문자열 표현 정규 표현식 패턴과 일치하는 부분이 대체 문자열로 바뀐 소스 문자열을 반환합니다. 일치하는 것이 없으면 원래 문자열을 반환합니다.
REGEXP_SUBSTR 문자열 표현 정규 표현식 패턴과 일치하는 부분문자열의 n번째 발생을 반환합니다.
REGEXP_INSTR int 매칭된 부분 문자열의 시작 또는 종료 위치를 반환합니다.
REGEXP_COUNT int 문자열에서 정규 표현식 패턴이 나타나는 횟수를 반환합니다.

Syntax

REGEXP_LIKE ( string_expression, pattern_expression [ , flags ] )

REGEXP_REPLACE ( string_expression, pattern_expression [ , string_replacement [ , start [ , occurrence [ , flags ] ] ] ] )

REGEXP_SUBSTR ( string_expression, pattern_expression [ , start [ , occurrence [ , flags [ , group ] ] ] ] )

REGEXP_INSTR ( string_expression, pattern_expression [ , start [ , occurrence [ , return_option [ , flags [ , group ] ] ] ] ] )

REGEXP_COUNT ( string_expression, pattern_expression [ , start [ , flags ] ] )

각 인자에 대한 자세한 설명은 지원 함수에 연결된 함수 참조를 참조하세요.

플래그

선택 flags 인자는 일치하는 수정자를 설정하는 최대 30자 길이의 char 또는 varchar 값입니다. 모순되는 플래그를 제공하면 마지막 플래그가 적용됩니다. 예를 들어, 'ic' 대/소문자를 구분하여 일치시킵니다.

Flag Description
c 대/소문자를 구분하는 일치입니다. 이것이 기본값입니다.
i 대/소문자를 구분하지 않는 일치
m 다중 줄 모드: ^ 및 $는 각 줄의 시작과 끝뿐만 아니라 텍스트의 시작과 끝까지 일치합니다.
s 새 줄(newline) 문자\n를 매칭해 . 봅시다.

Considerations

  • string_expression 인자는 문자 문자열 유형을 수용합니다. 큰 값(varchar(max))은 최대 2MB까지 지원합니다.
  • pattern_expression 인수는 최대 8,000바이트 길이를 지원합니다.
  • 정규 표현식 함수는 콜레이션 규칙을 존중하지 않습니다. 매칭은 LIKE와 같은 다른 문자열 비교와 다를 수 있습니다. 대소문자 구분을 제어하려면 열 데이터 정렬 규칙에 의존하지 말고 c 및 i 플래그를 대신 사용하세요. 자세한 내용은 Data Warehouse 데이터 정렬 참조하세요.
  • REGEXP_LIKE 불리언 값을 반환하며 직접 열로 반환할 수 없습니다. 결과를 열로 반환하려면 CASE 표현식으로 결과를 감싸세요.

Examples

다음 예시들은 작은 인라인 데이터 세트를 사용하므로 어떤 웨어하우스나 SQL 분석 엔드포인트에서도 실행할 수 있습니다.

A. 패턴과 일치하는 행을 필터링

REGEXP_LIKE 절에서 WHERE를 사용하여 유효한 이메일 주소 형식의 행만 반환하세요.

SELECT CustomerId, Email
FROM (VALUES
        (1, 'anna@contoso.com'),
        (2, 'not-an-email'),
        (3, 'Bob.Smith@Fabrikam.org')
     ) AS c (CustomerId, Email)
WHERE REGEXP_LIKE(Email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');

일치 결과를 열로 반환하려면 CASE를 REGEXP_LIKE 식으로 감싸세요:

SELECT Email,
       CASE WHEN REGEXP_LIKE(Email, '@contoso\.com$', 'i') THEN 'Internal' ELSE 'External' END AS EmailType
FROM (VALUES ('anna@CONTOSO.com'), ('bob@fabrikam.org')) AS c (Email);

B. 텍스트에서 값을 추출하기

REGEXP_SUBSTR 자유 텍스트 주석에서 ORD- 뒤에 숫자가 오는 형식의 첫 번째 주문 번호를 추출하는 데 사용하세요.

SELECT Comment,
       REGEXP_SUBSTR(Comment, 'ORD-\d+') AS OrderNumber
FROM (VALUES
        ('Customer called about ORD-10293 and ORD-10311.'),
        ('No order referenced.')
     ) AS t (Comment);

매치의 일부만 추출하려면 캡처 그룹을 사용하세요. 다음 쿼리는 각 이메일 주소의 도메인을 반환합니다:

SELECT REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1) AS EmailDomain
FROM (VALUES ('anna@contoso.com'), ('bob@fabrikam.org')) AS c (Email);

C. 패턴 발생 횟수 계산

REGEXP_COUNT를 사용하여 각 문자열에 나타나는 숫자의 개수를 세세요.

SELECT Comment,
       REGEXP_COUNT(Comment, '\d+') AS NumberCount
FROM (VALUES
        ('Shipped 3 boxes on 12 May, invoice 4471.'),
        ('No numbers here.')
     ) AS t (Comment);

D. 일치하는 위치를 찾기

REGEXP_INSTR를 사용하여 첫 번째 숫자 시퀀스의 시작 위치와 끝 위치를 찾으세요.

SELECT ProductCode,
       REGEXP_INSTR(ProductCode, '\d+')             AS FirstDigitStart,
       REGEXP_INSTR(ProductCode, '\d+', 1, 1, 1)    AS FirstDigitEnd
FROM (VALUES ('BK-R93R-62'), ('HL-U509')) AS p (ProductCode);

E. 데이터 정리 및 마스킹

REGEXP_REPLACE를 사용하여 캡처 그룹과 함께 전화번호를 표준화하고, 마지막 네 자리를 제외한 모든 숫자를 가리세요.

SELECT Phone,
       REGEXP_REPLACE(Phone, '^(\d{3})-(\d{3})-(\d{4})$', '(\1) \2-\3') AS FormattedPhone,
       REGEXP_REPLACE(Phone, '^\d{3}-\d{3}', '***-***')               AS MaskedPhone
FROM (VALUES ('425-555-0187'), ('206-555-0142')) AS c (Phone);

다음 쿼리는 반복된 여백을 하나의 공백으로 압축합니다:

SELECT REGEXP_REPLACE('Fabric    Data   Warehouse', '\s+', ' ') AS CleanText;

F. 추출된 값을 기준으로 그룹화 및 집계

함수들이 스칼라이기 때문에 GROUP BY 절에서 사용할 수 있습니다. 다음 쿼리는 이메일 도메인별로 고객을 집계합니다.

SELECT LOWER(REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1)) AS EmailDomain,
       COUNT(*) AS Customers
FROM (VALUES
        ('anna@contoso.com'),
        ('bob@Contoso.com'),
        ('chris@fabrikam.org')
     ) AS c (Email)
GROUP BY LOWER(REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1));