REGEXP_LIKE(Transact-SQL)

適用対象: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL データベース

正規表現パターンが文字列内で一致するかどうかを示します。

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

文字列の式。

文字列の定数、変数、または列を指定できます。

データ型: charncharvarchar、または nvarchar

Note

REGEXP_*関数はstring_expressionパラメータに対して最大2MBまでのLOB型(varchar(max)およびnvarchar(max))をサポートしています。

pattern_expression

照合する正規表現パターン。 通常はテキスト リテラルです。

データ型: charncharvarchar、または nvarcharpattern_expression では、最大文字数 8,000 バイトがサポートされています。

flags

一致を検索するために使用する修飾子を指定する 1 つ以上の文字。 型は varchar または char で、最大 30 文字です。

たとえば、ims のようにします。 既定値は cです。 空の文字列 (' ') が指定されている場合は、既定値 ('c')として扱われます。 cまたはその他の文字式を指定します。 フラグに複数の矛盾する文字が含まれている場合、SQL Server は最後の文字を使用します。

たとえば、正規表現 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

カーディナリティ推定

関数のREGEXP_LIKEの精度を高めるために、ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXPASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXPのクエリヒントを使ってデフォルトの選択性値を調整します。 詳細については、 Query ヒントを参照してください。

これらのクエリヒントは、 濃度推定(CE)フィードバックとも統合されます。 CEフィードバックモデルは、推定行数と実際の行数に大きな差がある REGEXP_LIKE 関数を使うクエリを自動的に特定します。 次に、クエリ レベルで適切な選択度ヒントを適用して、手動入力を必要とせずにプランの品質を向上させます。

自動フィードバック動作を無効にするには、トレース フラグ 16268 を有効にします。

SARGable パターンサポート

REGEXP_LIKEパターンがアンカー^から始まる場合にのみSARG可能となります。 さらに、固定パターンには以下が含まれます:

  • 量化子: *+?{n}{n,}、または {n,m}。 たとえば、^ab+ または ^ab* です。
  • [0-9A-Za-z]のようなレンジキャラクター。

メタキャラクターから逃れるには、バックスラッシュ(\)を使います。

これらの条件により、クエリオプティマイザーはインデックスシーク操作を使ってクエリ性能を向上させます。

正規表現は照合ルールを尊重しません。 これらの挙動は、 LIKEなど他の文字列比較関数とは異なる場合があります。 この違いは、言語固有の照合を持つインデックス付きカラムで特に重要です。

たとえば、トルコ語の照合順序では、言語固有の規則により、大文字と小文字が区別されない照合順序でも、 i 文字と I 文字が個別に扱われます。 詳細は例 Fを参照してください。トルコ式照合とSARG可能なパターンマッチングと非SARG対応パターンマッチングを比較してください

Note

リレーショナルデータベースにおける SARGable という用語は、インデックスを使用してクエリの実行を高速化できる Search ARGumentable な述語(検索条件)を指します。 詳細については、 SQL Server と Azure SQL インデックスのアーキテクチャと設計ガイドを参照してください。

Examples

A. 特定の文字で始まって終わる値をマッチングしてください

名前がEmployeesで始まり、Aで終わるY表からすべてのレコードを選択します。

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

B. 大文字に区別されないパターンマッチを実行する

名前がEmployeesで始まりAで終わるY表から、小文字を区別しないモードで選択します:

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

C. 正規表現パターンを用いたマッチ日

注文日が 2020 年 2 月である Orders テーブルからすべてのレコードを選択します。

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

D. 繰り返しの文字パターンを一致させる

製品名に 3 つ以上の連続する母音が含まれる Products テーブルからすべてのレコードを選択します。

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

E. CHECK制約によるデータ検証の強制

CHECK列とEmail列に対してPhone_Number制約を持つ従業員テーブルを作成します。

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})$'))
);

F。 SARG可能と非SARG可能なパターンマッチングをトルコ式照合と比較してください

この例は、トルコ式照合を用いた REGEXP_LIKE 関数のSARG可能および非SARG可能の使用を示しています。

-- 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' match.
SELECT 'Non-SARGable' AS PatternType,
       *
FROM #Users
WHERE REGEXP_LIKE (Username, 'i', 'i');

-- Cleanup
DROP TABLE #Users;