エンコード関数と類似性関数
SQL Server 2025 では、文字列エンコードと類似性測定のための新しい関数が導入されています。 これらの機能は、セキュリティで保護されたデータ変換、あいまい一致、および自然言語の比較を T-SQL 内で直接サポートします。
外部ツールやユーザー定義関数に依存することなく、重複を検出したり、レコードを標準化したり、近くの一致を見つけたりすることが容易になります。
エンコードと類似性関数の概要
BASE64_ENCODE
varbinary 値を Base64 でエンコードされた varchar 文字列に変換します。 JSON ペイロードと Web API でのストレージまたは転送のためにバイナリ データを安全にエンコードするために一般的に使用されます。 テキスト文字列をエンコードするには、最初に varbinary にキャストします: BASE64_ENCODE(CAST(@text AS VARBINARY(MAX)))。
BASE64_DECODE
Base64 でエンコードされた varchar 文字列を varbinary に変換します。 テキスト文字列を回復するには、 varbinary の結果をキャストします: CAST(BASE64_DECODE(@encoded) AS NVARCHAR(MAX))。
これら 2 つの関数を組み合わせることで、SQL Server と他のシステム間の安全で移植可能なデータ交換を管理できます。
Note
次のあいまい文字列一致関数は、SQL Server 2025 (17.x) のプレビュー段階にあり、使用する前にPREVIEW_FEATURESを有効にする必要があります。
ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
これらは、Microsoft Fabricの Azure SQL Database、Azure SQL Managed Instance、および SQL データベースで一般提供されています。
EDIT_DISTANCE
1 つの文字列を別の文字列に変更するために必要な 1 文字の編集 (挿入、削除、または置換) の数を計算します。
EDIT_DISTANCE_SIMILARITY
編集距離を 0 (類似性なし) から 100 (完全一致) までの整数の類似性スコアに変換し、Damerau-Levenshtein アルゴリズムを使用して (1 – edit_distance / max_length) × 100 計算します。
JARO_WINKLER_DISTANCE
転置とプレフィックスの一致に基づいて、2 つの文字列間の距離を測定します。 名前または短い識別子を比較するために一般的に使用されます。
JARO_WINKLER_SIMILARITY
Jaro-Winkler アルゴリズムを使用して、0 (一致なし) から 100 (完全一致) までの整数の類似性スコアを返します。これにより、文字列の先頭にある一致する文字に余分な重みが与えられます。
入力ミスを含む名前、会社のレコード、またはユーザー入力を照合する場合に便利です。
例 1: 機密データのエンコードとデコード
システム管理者は、監査またはエクスポート中の偶発的な露出を防ぐために、エンコードされた形式で API キーを格納したいと考えています。 キーは、構成テーブルに書き込まれる前に Base64 でエンコードできます。
クエリ: エンコードとデコードの例
DECLARE @ApiKey NVARCHAR(100) = 'AppKey-2025-SECURE';
DECLARE @Encoded NVARCHAR(MAX);
DECLARE @Decoded NVARCHAR(MAX);
-- Encode the API key (cast nvarchar to varbinary first)
SET @Encoded = BASE64_ENCODE(CAST(@ApiKey AS VARBINARY(MAX)));
-- Decode it back (cast varbinary result back to nvarchar)
SET @Decoded = CAST(BASE64_DECODE(@Encoded) AS NVARCHAR(MAX));
SELECT @ApiKey AS OriginalValue, @Encoded AS EncodedValue, @Decoded AS DecodedValue;
結果
| 元の値 | エンコードされた値 (EncodedValue) | DecodedValue |
|---|---|---|
| AppKey-2025-SECURE | QXBwS2V5LTIwMjUtU0VDVVJF | AppKey-2025-SECURE |
この例では、データをストレージ用に安全にエンコードするか、必要に応じて T-SQL 内で転送およびデコードする方法を示します。
例 2: 文字列の類似性を比較する
データ品質エンジニアは、一貫性のないデータ入力が原因で顧客テーブル内のほぼ重複するエントリを検出する必要があります。
SQL Server 2025 の類似性関数を使用すると、入力ミスや余分なスペースなど、わずかに異なるレコードを識別できます。
サンプル データ
| 顧客ID | 顧客名 |
|---|---|
| 1 | ジョナソン・スミス |
| 2 | ジョナサン・スミス |
| 3 | J. スミス |
| 4 | John Smith |
クエリ: 名前と類似性関数を比較する
SELECT
A.CustomerName AS NameA,
B.CustomerName AS NameB,
EDIT_DISTANCE(A.CustomerName, B.CustomerName) AS EditSteps,
EDIT_DISTANCE_SIMILARITY(A.CustomerName, B.CustomerName) AS EditSimilarity,
JARO_WINKLER_SIMILARITY(A.CustomerName, B.CustomerName) AS JaroScore
FROM dbo.Customers A
JOIN dbo.Customers B
ON A.CustomerID < B.CustomerID
ORDER BY EditSimilarity DESC;
結果
| NameA | NameB | EditSteps | EditSimilarity | JaroScore |
|---|---|---|---|---|
| ジョナソン・スミス | ジョナサン・スミス | 1 | 93 | 94 |
| ジョナサン・スミス | John Smith | 4 | 77 | 79 |
| ジョナソン・スミス | J. スミス | 6 | 68 | 70 |
| J. スミス | John Smith | 5 | 62 | 66 |
この出力は、"Jonathon Smith" と "Jonathan Smith" がほとんど同じであることを示していますが、"J. Smith" の場合は異なることを示しています。 Smith" と "John Smith" は部分的な類似性を共有します。
これらのスコアは、データをマージまたはクリーニングする前に重複の可能性を特定するのに役立ちます。
例 3: エンコードと類似性の組み合わせ
一部のシステムでは、エンコードされた識別子を間接的に比較する必要があります。 デコードしてから類似性を適用することで、エンコードされたデータ間でパターンや重複を検出できます。
DECLARE @Encoded1 NVARCHAR(MAX) = BASE64_ENCODE(CAST('User-713' AS VARBINARY(MAX)));
DECLARE @Encoded2 NVARCHAR(MAX) = BASE64_ENCODE(CAST('User-713X' AS VARBINARY(MAX)));
SELECT
@Encoded1 AS EncodedA,
@Encoded2 AS EncodedB,
EDIT_DISTANCE_SIMILARITY(
CAST(BASE64_DECODE(@Encoded1) AS NVARCHAR(MAX)),
CAST(BASE64_DECODE(@Encoded2) AS NVARCHAR(MAX))
) AS EditSimilarity;
結果
| EncodedA | EncodedB | EditSimilarity |
|---|---|---|
| VXNlci03MTM= | VXNlci03MTNY | 89 |
この例では、Base64 値をデコードした後でも、SQL Server は追加の処理レイヤーなしで類似性スコアを計算できることを示しています。
概要
SQL Server 2025 は、Base64 エンコードと文字列の類似性分析用の組み込み関数を使用して T-SQL を拡張します。
開発者は、SQL クエリで文字列を直接エンコード、デコード、比較して、データ品質を向上させ、ほぼ重複を検出し、セキュリティで保護されたテキスト変換を処理できるようになりました。
これらのツールを使用すると、以前は外部スクリプトまたは CLR 統合が必要だったタスクが簡略化され、テキスト負荷の高いワークロードのパフォーマンスと保守性の両方が向上します。