다음을 통해 공유


REGEXP_LIKE(Transact-SQL) 미리 보기

적용 대상:Microsoft Fabric Preview에서 SQL Server 2025(17.x) 미리 보기 Azure SQL DatabaseAzure SQL Managed Instance SQL 데이터베이스

Note

미리 보기 기능으로, 이 문서에 제시된 기술에는 Microsoft Azure 프리뷰에 대한 보충 사용 약관이 적용됩니다.

정규식 패턴이 문자열에서 일치하는지 나타냅니다.

REGEXP_LIKE 
     (
      string_expression,
      pattern_expression [, flags ]
     )

REGEXP_LIKE 에는 데이터베이스 호환성 수준 170 이상이 필요합니다. 데이터베이스 호환성 수준이 170 REGEXP_LIKE 보다 낮으면 사용할 수 없습니다. 다른 정규식 스칼라 함수는 모든 호환성 수준에서 사용할 수 있습니다.

뷰 또는 데이터베이스 속성에서 sys.databases 호환성 수준을 확인할 수 있습니다. 다음 명령을 사용하여 데이터베이스의 호환성 수준을 변경할 수 있습니다.

ALTER DATABASE [DatabaseName] SET COMPATIBILITY_LEVEL = 170;

Note

정규식은 SQL Server 2025 또는 Always-up-to-date업데이트 정책을 사용하여 Azure SQL Managed Instance에서 사용할 수 있습니다.

Arguments

string_expression

문자열의 식입니다.

문자열의 상수, 변수 또는 열일 수 있습니다.

데이터 형식: char, nchar, varchar 또는 nvarchar.

Note

, REGEXP_COUNTREGEXP_INSTRREGEXP_SUBSTR 함수는 REGEXP_LIKEstring_expression 매개 변수에 대해 LOB 형식(varchar(max)nvarchar(max))를 최대 2MB까지 지원합니다.

pattern_expression

일치시킬 정규식 패턴입니다. 일반적으로 텍스트 리터럴입니다.

데이터 형식: char, nchar, varchar 또는 nvarchar. pattern_expression 최대 문자 길이는 8,000바이트입니다.

flags

일치 항목을 검색하는 데 사용되는 한정자를 지정하는 하나 이상의 문자입니다. varchar 또는 char 형식이며 최대 30자입니다.

예: ims. 기본값은 c입니다. 빈 문자열 (' ') 이 제공되면 기본값 ('c')으로 처리됩니다. 또는 다른 문자 식을 제공합니다 c . 플래그에 모순된 문자가 여러 개 있는 경우 SQL Server는 마지막 문자를 사용합니다.

예를 들어 regex를 지정 ic 하면 대/소문자를 구분하는 일치 항목이 반환됩니다.

값에 지원되는 플래그 값에 나열된 문자가 아닌 문자가 포함된 경우 쿼리는 다음 예제와 같은 오류를 반환합니다.

Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
지원되는 플래그 값
Flag Description
i 대/소문자를 구분하지 않습니다(기본값 false)
m 여러 줄 모드: ^$ 시작/끝 텍스트 외에 시작/끝 선 일치(기본값 false)
s 일치 . 허용\n(기본값false)
c 대/소문자 구분(기본값 true)

반환 값

부울 값입니다. true 또는 false.

Remarks

SARGability 지원

적용 대상: Microsoft Fabric의 Azure SQL Database, Azure SQL Managed Instance 및 SQL 데이터베이스. 현재 SQL Server에서 지원되지 않습니다.

REGEXP_LIKE는 패턴이 앵커 로 시작될 때 ^를 지원하며, 예를 들어 *+ ,?, {n}{n,}{n,m},, ^ab+등의 수량자를 ^ab*포함하는 패턴도 지원합니다. 또한 같은 [0-9A-Za-z] 범위 문자를 지원하고 백슬래시를 \ 사용하여 메타 문자에서 이스케이프할 수 있습니다. 이렇게 하면 쿼리 최적화 프로그램에서 인덱스 검색 작업을 사용하여 쿼리 성능을 향상시킬 수 있습니다. 그러나 정규식은 데이터 정렬 규칙을 적용하지 않으므로, 특히 언어별 데이터 정렬이 있는 인덱싱된 열에서와 같은 LIKE다른 문자열 비교 함수와 비교할 때 동작의 차이가 발생할 수 있습니다.

예를 들어 터키어 데이터 정렬에서 문자 iI 언어별 규칙으로 인해 대/소문자를 구분하지 않는 데이터 정렬에서도 뚜렷하게 처리됩니다.

Note

관계형 데이터베이스에서 SARGable 이라는 용어는 인덱스를 사용하여 쿼리 실행 속도를 높일 수 있는 Search ARGumentable 조건자를 나타냅니다. 자세한 내용은 SQL Server 및 Azure SQL 인덱스 아키텍처 및 디자인 가이드를 참조하세요.

카디널리티 예측

함수에 대한 REGEXP_LIKE의 정확도를 높이기 위해 쿼리 힌트를 ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP 사용하여 ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP 기본 선택성 값을 조정할 수 있습니다. 자세한 내용은 쿼리 힌트를 참조하세요.

이러한 쿼리 힌트는 CE(카디널리티 추정) 피드백과도 통합됩니다. CE 피드백 모델은 예상 행 수와 실제 행 수 사이에 상당한 차이가 있는 함수를 사용하여 REGEXP_LIKE 쿼리를 자동으로 식별합니다. 그런 다음, 수동 입력 없이도 계획 품질을 개선하기 위해 쿼리 수준에서 적절한 선택성 힌트를 적용합니다.

자동 피드백 동작을 사용하지 않도록 설정하려면 추적 플래그 16268을 사용하도록 설정합니다.

Examples

이름이 시작 EMPLOYEES 되고 A로 끝나는 테이블에서 모든 레코드를 선택합니다.Y

SELECT * FROM EMPLOYEES WHERE REGEXP_LIKE (FIRST_NAME, '^A.*Y$'); 

주문 날짜가 ORDERS 2020년 2월인 테이블에서 모든 레코드를 선택합니다.

SELECT * FROM ORDERS WHERE REGEXP_LIKE (ORDER_DATE, '2020-02-\d\d'); 

제품 이름에 PRODUCTS 3개 이상의 연속 모음이 포함된 테이블에서 모든 레코드를 선택합니다.

SELECT * FROM PRODUCTS WHERE REGEXP_LIKE (PRODUCT_NAME, '[AEIOU]{3,}'); 

열에 CHECK 대한 Email 제약 조건이 있는 Phone_Number Employees 테이블을 만듭니다.

DROP TABLE IF EXISTS EMPLOYEES;

CREATE TABLE EMPLOYEES (  
    ID INT IDENTITY(101,1),  
    [Name] VARCHAR(150),  
    Email VARCHAR(320)  
    CHECK (REGEXP_LIKE(Email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')),  
    Phone_Number NVARCHAR(20)  
    CHECK (REGEXP_LIKE (Phone_Number, '^(\d{3})-(\d{3})-(\d{4})$'))  
);

다음은 터키어 데이터 정렬을 사용하여 함수의 REGEXP_LIKE SARGable 및 비 SARGable 사용을 보여 주는 예제입니다.

-- Create a temporary table with Turkish collation and and an index
CREATE TABLE #Users (
    Username NVARCHAR(100) COLLATE Turkish_100_CI_AS_SC_UTF8 NOT NULL,
    INDEX idx_username (Username)
);

-- Insert sample data
INSERT INTO #Users (Username)
VALUES (N'i'),    -- lowercase i
       (N'I'),    -- uppercase dotless I
       (N'İ'),    -- uppercase dotted İ
       (N'abc');

-- SARGable pattern: starts with ^ and uses quantifier
-- This will use index seek if applicable, but REGEXP_LIKE ignores collation
-- So 'i' and 'I' are treated as different characters
SELECT 'SARGable' AS PatternType, * 
FROM #Users
WHERE REGEXP_LIKE(Username, '^i');

-- Non-SARGable pattern: does not start with ^
-- REGEXP_LIKE performs full scan, and matches are case-insensitive since 'i' flag is supplied
-- So both 'i' and 'I' will match
SELECT 'Non-SARGable' AS PatternType, * 
FROM #Users
WHERE REGEXP_LIKE(Username, 'i','i');

-- Cleanup
DROP TABLE #Users;