정규식을 사용하여 패턴과 일치시킵니다.

완료됨

팁 (조언)

자세한 내용은 텍스트 및 이미지 탭을 참조하세요.

데이터베이스의 텍스트 처리에는 연산자가 처리할 수 있는 것 이상으로 패턴 일치가 LIKE 필요한 경우가 많습니다. 정규식은 복잡한 패턴 일치, 유효성 검사 및 텍스트 변환을 위한 표준화된 구문을 제공합니다. Microsoft Fabric의 SQL Server 2025 및 SQL 데이터베이스에는 새로운 T-SQL 함수를 통한 정규식 지원이 포함됩니다.

LIKE만으로는 부족한 경우를 생각해 보겠습니다. 예를 들어, 올바른 형식의 이메일 주소인지 검증해야 하거나, 형식이 달라도 전화번호를 추출해야 하거나, 특정 명명 규칙을 따르는 제품 코드를 찾아야 하거나, 같은 문자가 연속해서 반복되는 패턴을 감지해야 하는 경우입니다. 연산자는 LIKE 이러한 복잡한 패턴을 표현할 수 없는 간단한 와일드카드(% 모든 문자, _ 단일 문자의 경우)만 지원합니다.

정규식은 풍부한 패턴 언어를 제공하여 이러한 제한 사항을 해결합니다. regex를 사용하면 특정 문자 범위를 일치시키고, 정확한 반복 횟수가 필요하고, 교대(이 OR와 일치)를 사용하고, 추출 또는 바꾸기를 위해 일치하는 텍스트의 일부를 캡처할 수 있습니다. regex 구문을 알게 되면 여러 프로그래밍 언어 및 도구에 적용할 수 있습니다. SQL Server에 대해 작성하는 패턴은 Python, JavaScript 및 명령줄 유틸리티에서 유사하게 작동합니다.

정규식 기본 사항 이해

정규 표현식(regex)은 패턴 구문을 사용하여 텍스트 패턴을 설명합니다. SQL Server의 함수를 알아보기 전에 다음과 같은 일반적인 정규식 구성 요소를 검토해 보겠습니다.

패턴 Description 일치 예제
. 모든 단일 문자 a.c 는 "abc", "a1c"과 일치합니다.
* 앞의 항목 중 0개 이상 ab*c 는 "ac", "abc", "abbc"와 일치합니다.
+ 이전 항목 중 하나 이상 ab+c 는 "abc", "abbc"와 일치하지만 "ac"와 일치하지 않습니다.
? 앞선 항목 중 0개 또는 1개 colou?r"color", "colour"를 칭합니다.
^ 문자열 시작 ^Hello"Hello"로 시작하는 문자열과 일치합니다.
$ 문자열의 끝 world$"world"로 끝나는 문자열과 일치합니다.
[abc] 캐릭터 클래스 [aeiou]는 어떤 모음과도 일치합니다.
[^abc] 부정된 클래스 [^0-9] 비숫자와 일치
\d 숫자(0-9) \d{3} 3자리 숫자와 일치
\w 단어 문자 \w+ 단어 문자와 일치
{n} 정확히 n번 발생 \d{4} 정확히 4자리 숫자와 일치
{n,m} n과 m 발생 사이 \d{2,4} 2~4자리 숫자와 일치

비고

SQL Server의 정규식 함수는 ECMAScript 표준 정규식 구문을 사용합니다. 이 스크립트는 JavaScript 및 다른 많은 프로그래밍 언어에서 사용되는 것과 동일한 구문으로, 여러 기술에서 패턴을 이식할 수 있습니다.

REGEXP_LIKE과(와) 패턴이 일치하다

REGEXP_LIKE 는 문자열이 정규식 패턴과 일치하는 경우 1(true)을 반환하고, 그렇지 않으면 0(false)을 반환합니다. 절에서 WHERE 이 함수를 사용하여 복잡한 패턴에 따라 행을 필터링합니다.

-- Find customers with email addresses from specific domains
SELECT CustomerID, FirstName, LastName, EmailAddress
FROM SalesLT.Customer
WHERE REGEXP_LIKE(EmailAddress, '@(contoso|adventure-works|fabrikam)\.com$') = 1;

데이터 형식의 유효성을 검사합니다.

-- Find valid US phone numbers (various formats)
SELECT CustomerID, Phone
FROM SalesLT.Customer
WHERE REGEXP_LIKE(Phone, '^\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$') = 1;

-- Validate product numbers match expected format (XX-XXXX)
SELECT ProductID, ProductNumber, Name
FROM SalesLT.Product
WHERE REGEXP_LIKE(ProductNumber, '^[A-Z]{2}-[A-Z0-9]{4,6}$') = 1;

flags 매개 변수와 대/소문자 구분 없이 일치하도록 사용합니다.

-- 'i' flag enables case-insensitive matching
SELECT Name
FROM SalesLT.Product
WHERE REGEXP_LIKE(Name, 'frame', 'i') = 1;

팁 (조언)

유효성 검사 및 필터링에 사용합니다 REGEXP_LIKE . 패턴이 존재하는지 여부만 알아야 하는 경우 부분 문자열을 추출하는 것보다 더 효율적입니다.

텍스트를 다음으로 바꾸기 REGEXP_REPLACE

REGEXP_REPLACE 는 패턴의 모든 항목을 찾아서 지정된 문자열로 대체합니다. 이 함수는 데이터 정리 및 표준화에 유용합니다.

-- Standardize phone numbers to (XXX) XXX-XXXX format
SELECT 
    Phone AS OriginalPhone,
    REGEXP_REPLACE(
        REGEXP_REPLACE(Phone, '[^\d]', ''),  -- First remove all non-digits
        '^(\d{3})(\d{3})(\d{4})$',
        '($1) $2-$3'
    ) AS StandardizedPhone
FROM SalesLT.Customer
WHERE Phone IS NOT NULL;

다음 예제에서는 역참조를 사용하여 캡처 그룹을 사용하는 방법을 보여 줍니다.

-- Swap first and last name
DECLARE @name NVARCHAR(100) = 'Smith, John';
SELECT REGEXP_REPLACE(@name, '^(\w+),\s*(\w+)$', '$2 $1') AS SwappedName;
-- Returns: John Smith

-- Mask credit card numbers (show last 4 digits only)
DECLARE @card NVARCHAR(20) = '4532-1234-5678-9012';
SELECT REGEXP_REPLACE(@card, '\d(?=[\d-]{4,})', '*') AS MaskedCard;
-- Returns: ****-****-****-9012

다음 예제에서는 데이터를 정리하고 정규화하는 방법을 보여 줍니다.

-- Remove extra whitespace (multiple spaces to single space)
SELECT REGEXP_REPLACE(Description, '\s+', ' ') AS CleanedDescription
FROM Products;

-- Remove HTML tags
SELECT REGEXP_REPLACE(HtmlContent, '<[^>]+>', '') AS PlainText
FROM WebPages;

REGEXP_SUBSTR 사용하여 부분 문자열 추출

REGEXP_SUBSTR 는 정규식 패턴과 일치하는 문자열 부분을 추출합니다. 다음 예제와 같이 구조화되지 않은 텍스트에서 특정 데이터 요소를 끌어오려면 사용합니다.

-- Extract domain from email address
SELECT 
    EmailAddress,
    REGEXP_SUBSTR(EmailAddress, '@(.+)$', 1, 1, '', 1) AS Domain
FROM SalesLT.Customer
WHERE EmailAddress IS NOT NULL;

-- Extract the first number from a string
SELECT 
    ProductNumber,
    REGEXP_SUBSTR(ProductNumber, '\d+') AS FirstNumber
FROM SalesLT.Product;

다음 예제에서는 발생 및 캡처 그룹에 대한 매개 변수를 포함하는 함수 서명을 보여 줍니다.

REGEXP_SUBSTR(source, pattern, start_position, occurrence, flags, capture_group)

을 사용하여 패턴 위치 찾기 REGEXP_INSTR

REGEXP_INSTR 는 문자열 내에서 패턴 일치의 시작 위치를 반환합니다. 다음 예제와 같이 일치하는 항목이 없으면 0을 반환합니다.

-- Find position of first digit in product number
SELECT 
    ProductNumber,
    REGEXP_INSTR(ProductNumber, '\d') AS FirstDigitPosition
FROM SalesLT.Product;

-- Find position of email domain
SELECT 
    EmailAddress,
    REGEXP_INSTR(EmailAddress, '@') AS AtPosition,
    REGEXP_INSTR(EmailAddress, '\.[a-z]+$', 1, 1, 0, 'i') AS TldPosition
FROM SalesLT.Customer
WHERE EmailAddress IS NOT NULL;

다음을 사용하여 패턴 발생 횟수 계산 REGEXP_COUNT

REGEXP_COUNT 는 패턴이 문자열에 표시되는 횟수를 반환합니다. 다음 예제에서는 해당 용도를 보여 줍니다.

-- Count words in a description
SELECT  
    Name,
    REGEXP_COUNT(Name, '\w+') AS WordCount
FROM SalesLT.Product;

-- Count vowels in product names
SELECT 
    Name,
    REGEXP_COUNT(Name, '[aeiou]', 1, 'i') AS VowelCount
FROM SalesLT.Product;

-- Find products with multiple numbers in their name
SELECT Name
FROM SalesLT.Product
WHERE REGEXP_COUNT(Name, '\d+') > 1;

REGEXP_SPLIT_TO_TABLE을 사용하여 문자열을 분할.

REGEXP_SPLIT_TO_TABLE 는 구분 기호 패턴에 따라 문자열을 행으로 분할하는 테이블 반환 함수입니다.

-- Split comma-separated values
DECLARE @tags NVARCHAR(200) = 'sql,database,azure,analytics';
SELECT value AS Tag
FROM REGEXP_SPLIT_TO_TABLE(@tags, ',');

-- Split on multiple delimiters (comma, semicolon, or pipe)
DECLARE @data NVARCHAR(200) = 'apple,banana;cherry|date';
SELECT value AS Fruit
FROM REGEXP_SPLIT_TO_TABLE(@data, '[,;|]');

REGEXP_SPLIT_TO_TABLE를 다른 쿼리와 CROSS APPLY을(를) 사용하여 결합할 수 있습니다.

-- Assuming Products table has a Tags column with comma-separated values
SELECT 
    p.ProductID,
    p.Name,
    t.value AS Tag
FROM Products AS p
CROSS APPLY REGEXP_SPLIT_TO_TABLE(p.Tags, ',\s*') AS t;

를 사용하여 모든 일치 항목을 반환합니다. REGEXP_MATCHES

REGEXP_MATCHES 는 모든 패턴 일치 항목을 별도의 행으로 반환하는 테이블 반환 함수입니다.

-- Find all numbers in a string
DECLARE @text NVARCHAR(200) = 'Order 12345 contains 3 items totaling $99.99';
SELECT match_value, match_index
FROM REGEXP_MATCHES(@text, '\d+\.?\d*');
-- Returns: 12345, 3, 99.99

중요합니다

정규식 함수는 Microsoft Fabric의 SQL Server 2025 및 SQL 데이터베이스에서 사용할 수 있습니다. 이전 SQL Server 버전의 경우 복잡한 정규식 작업에 CLR(공용 언어 런타임) 함수 또는 애플리케이션 계층 처리를 사용하는 것이 좋습니다.

정규식 함수에 대한 자세한 내용은 정규식을 참조하세요.