適用対象: SQL Server 2025 (17.x)
Azure SQL Database
Azure SQL Managed Instance
SQL データベース
正規表現パターンが文字列内で一致するかどうかを示します。
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_*関数はstring_expressionパラメータに対して最大2MBまでのLOB型(varchar(max)およびnvarchar(max))をサポートしています。
pattern_expression
照合する正規表現パターン。 通常はテキスト リテラルです。
データ型: char、 nchar、 varchar、または nvarchar。 pattern_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_REGEXPとASSUME_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;