O que é correspondência de cordas difusas?

Aplica-se a: SQL Server 2025 (17.x) Base de Dados SQL do Azure AzureSQL Managed InstanceSQL database in Microsoft Fabric

Use a correspondência de cadeia de caracteres difusa ou aproximada para verificar se duas cadeias de caracteres são semelhantes e calcular a diferença entre duas cadeias de caracteres. Use esse recurso para identificar cadeias de caracteres que podem ser diferentes devido à corrupção de caracteres. A corrupção inclui erros ortográficos, caracteres transpostos, caracteres em falta ou abreviaturas. A correspondência de cordas difusa usa algoritmos para detetar cordas de som semelhantes.

Note

A correspondência aproximada de cadeias está atualmente em prévia para o SQL Server 2025 (17.x) e requer a ativação da funcionalidade de pré-visualização através da configuração de escopo da base de dados.

A correspondência de cadeia de caracteres difusa está disponível na Instância Gerenciada SQL do Azure com a política de atualizaçãoSQL Server 2025 ou Always-up-to-date.

Funções difusas

Function Description
EDIT_DISTANCE Calcula o número de inserções, exclusões, substituições e transposições necessárias para transformar uma cadeia de caracteres em outra.
EDIT_DISTANCE_SIMILARITY Calcula um valor de similaridade que varia de 0 (indicando nenhuma correspondência) a 100 (indicando correspondência completa).
JARO_WINKLER_DISTANCE Calcula a distância de edição entre duas cadeias de caracteres, dando preferência a cadeias de caracteres que correspondem desde o início para um comprimento de prefixo definido.
JARO_WINKLER_SIMILARITY Calcula um valor de similaridade que varia de 0 (indicando nenhuma correspondência) a 100 (indicando correspondência completa).

Note

As seguintes funcionalidades são atualmente suportadas apenas em Base de Dados SQL do Azure, base de dados SQL em Microsoft Fabric e Azure SQL Managed Instance configuradas com a política de atualização Always-up-to-date:

  • As funções de correspondência de strings difusas suportam colações no Windows e colações binárias (BIN e BIN2). O comportamento de comparação, incluindo sensibilidade a maiúsculas minúsculas, sensibilidade ao acento e regras linguísticas, é determinado pela colação das expressões de entrada.

    • Não são suportadas colações não-binárias SQL_* . Se estiver a usar uma colação não binária SQL_*, considere usar, em vez disso, uma colação do Windows correspondente.

    • Se não for viável alterar a base de dados ou a ordenação de uma coluna, pode aplicar uma ordenação do Windows suportada aos argumentos passados a uma função de correspondência difusa de cadeias, utilizando a cláusula COLLATE. Esta abordagem permite que a função avalie valores de entrada usando uma colação suportada sem exigir alterações mais amplas na base de dados.

Examples

Os exemplos a seguir demonstram as funções de correspondência de cadeia de caracteres difusa.

Tabela de exemplo

Antes de executar consultas de exemplo, crie e preencha uma tabela de exemplo.

Para criar e preencher a tabela de exemplo, conecte-se a um banco de dados de usuário que não seja de produção e execute o seguinte script:

-- Step 1: Create the table
CREATE TABLE WordPairs
(
    WordID INT IDENTITY (1, 1) PRIMARY KEY, -- Auto-incrementing ID
    WordUK NVARCHAR (50), -- UK English word
    WordUS NVARCHAR (50)  -- US English word
);

-- Step 2: Insert the data
INSERT INTO WordPairs (WordUK, WordUS)
VALUES ('Colour', 'Color'),
       ('Flavour', 'Flavor'),
       ('Centre', 'Center'),
       ('Theatre', 'Theater'),
       ('Organise', 'Organize'),
       ('Analyse', 'Analyze'),
       ('Catalogue', 'Catalog'),
       ('Programme', 'Program'),
       ('Metre', 'Meter'),
       ('Honour', 'Honor'),
       ('Neighbour', 'Neighbor'),
       ('Travelling', 'Traveling'),
       ('Grey', 'Gray'),
       ('Defence', 'Defense'),
       ('Practise', 'Practice'), -- Verb form in UK
       ('Practice', 'Practice'), -- Noun form in both
       ('Aluminium', 'Aluminum'),
       ('Cheque', 'Check'); -- Bank cheque vs. check

Exemplo EDIT_DISTANCE

SELECT WordUK,
       WordUS,
       EDIT_DISTANCE(WordUK, WordUS) AS Distance
FROM WordPairs
WHERE EDIT_DISTANCE(WordUK, WordUS) <= 2
ORDER BY Distance ASC;

Returns:

WordUK                         WordUS                         Distance
------------------------------ ------------------------------ -----------
Practice                       Practice                       0
Aluminium                      Aluminum                       1
Honour                         Honor                          1
Neighbour                      Neighbor                       1
Travelling                     Traveling                      1
Grey                           Gray                           1
Defence                        Defense                        1
Practise                       Practice                       1
Colour                         Color                          1
Flavour                        Flavor                         1
Organise                       Organize                       1
Analyse                        Analyze                        1
Catalogue                      Catalog                        2
Programme                      Program                        2
Metre                          Meter                          2
Centre                         Center                         2
Theatre                        Theater                        2

Exemplo EDIT_DISTANCE_SIMILARITY

SELECT WordUK,
       WordUS,
       EDIT_DISTANCE_SIMILARITY(WordUK, WordUS) AS Similarity
FROM WordPairs
WHERE EDIT_DISTANCE_SIMILARITY(WordUK, WordUS) >= 75
ORDER BY Similarity DESC;

Returns:

WordUK                         WordUS                         Similarity
------------------------------ ------------------------------ -----------
Practice                       Practice                       100
Travelling                     Traveling                      90
Aluminium                      Aluminum                       89
Neighbour                      Neighbor                       89
Organise                       Organize                       88
Practise                       Practice                       88
Defence                        Defense                        86
Analyse                        Analyze                        86
Flavour                        Flavor                         86
Colour                         Color                          83
Honour                         Honor                          83
Catalogue                      Catalog                        78
Programme                      Program                        78
Grey                           Gray                           75

Exemplo JARO_WINKLER_DISTANCE

SELECT WordUK,
       WordUS,
       JARO_WINKLER_DISTANCE(WordUK, WordUS) AS Distance
FROM WordPairs
WHERE JARO_WINKLER_DISTANCE(WordUK, WordUS) <= .05
ORDER BY Distance ASC;

Returns:

WordUK                         WordUS                         Distance
------------------------------ ------------------------------ -----------
Practice                       Practice                       0
Travelling                     Traveling                      0.02
Neighbour                      Neighbor                       0.0222222222222223
Aluminium                      Aluminum                       0.0222222222222223
Theatre                        Theater                        0.0285714285714286
Flavour                        Flavor                         0.0285714285714286
Centre                         Center                         0.0333333333333333
Colour                         Color                          0.0333333333333333
Honour                         Honor                          0.0333333333333333
Catalogue                      Catalog                        0.0444444444444444
Programme                      Program                        0.0444444444444444
Metre                          Meter                          0.0466666666666667

Exemplo JARO_WINKLER_SIMILARITY

SELECT WordUK,
       WordUS,
       JARO_WINKLER_SIMILARITY(WordUK, WordUS) AS Similarity
FROM WordPairs
WHERE JARO_WINKLER_SIMILARITY(WordUK, WordUS) > 90
ORDER BY Similarity DESC;

Returns:

WordUK                         WordUS                         Similarity
------------------------------ ------------------------------ -----------
Practice                       Practice                       100
Aluminium                      Aluminum                       98
Neighbour                      Neighbor                       98
Travelling                     Traveling                      98
Colour                         Color                          97
Flavour                        Flavor                         97
Centre                         Center                         97
Theatre                        Theater                        97
Honour                         Honor                          97
Catalogue                      Catalog                        96
Programme                      Program                        96
Metre                          Meter                          95
Organise                       Organize                       95
Practise                       Practice                       95
Analyse                        Analyze                        94
Defence                        Defense                        94

Exemplo de consulta com todas as funções

A consulta a seguir demonstra todas as funções de expressão regular atualmente disponíveis.

SELECT T.source_string,
       T.target_string,
       EDIT_DISTANCE(T.source_string, T.target_string) AS ED_Distance,
       JARO_WINKLER_DISTANCE(T.source_string, T.target_string) AS JW_Distance,
       EDIT_DISTANCE_SIMILARITY(T.source_string, T.target_string) AS ED_Similarity,
       JARO_WINKLER_SIMILARITY(T.source_string, T.target_string) AS JW_Similarity
FROM (VALUES ('Black', 'Red'),
             ('Colour', 'Yellow'),
             ('Colour', 'Color'),
             ('Microsoft', 'Msft'),
             ('Regex', 'Regex')
     ) AS T(source_string, target_string);

Returns:

source_string  target_string  ED_Distance    JW_Distance           ED_Similarity  JW_Similarity
-------------- -------------- -------------- --------------------- -------------- --------------
Black          Red            5              1                     0              0
Colour         Yellow         5              0.444444444444445     17             55
Colour         Color          1              0.0333333333333333    83             96
Microsoft      Msft           5              0.491666666666667     44             50
Regex          Regex          0              0                     100            100

Limpeza

Depois de terminares de usar os dados de exemplo, apaga a tabela de exemplo:

IF OBJECT_ID('dbo.WordPairs', 'U') IS NOT NULL
BEGIN
    DROP TABLE dbo.WordPairs;
END