SOUNDEX (Transact-SQL)函数使用

返回一个由四个字符组成的代码 (SOUNDEX),用于评估两个字符串的相似性。

主题链接图标 Transact-SQL 语法约定

语法

syntaxsql
SOUNDEX ( character_expression )  

 备注

若要查看 SQL Server 2014 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

character_expression
字符数据的字母数字表达式。 character_expression 可以是常量、变量或列。

返回类型

varchar

备注

SOUNDEX 会根据字符串的发音,将字母数字字符串转换成一个由四个字符组成的代码。 该代码的第一个字符是 character_expression 的第一个字符,已转换为大写**。 代码的第二个字符到第四个字符是表示表达式中的字母的数字。 除非字母 A、E、I、O、U、H、W 和 Y 是字符串的首字母,否则将忽略这些字母。 如果需要生成一个四字符代码,将在末尾添加零。 有关 SOUNDEX 代码的详细信息,请参阅 Soundex 索引系统

可比较不同字符串中的 SOUNDEX 代码以查看这些字符串发音的相似度。 DIFFERENCE 函数在两个字符串上执行一个 SOUNDEX,并返回一个整数,表示这些字符串的 SOUNDEX 代码的相似度。

SOUNDEX 区分排序规则。 可以嵌套字符串函数。

SOUNDEX 兼容性

在之前版本的 SQL Server 中,SOUNDEX 函数应用了 SOUNDEX 规则的子集。 在数据库兼容级别 110 或更高级别下,SQL Server 应用一组更完整的规则。

在升级到兼容级别 110 或更高级别后,可能需要重新生成使用 SOUNDEX 函数的索引、堆或 CHECK 约束。

  • 包含使用 SOUNDEX 定义的持久化计算列的堆无法查询,直到通过运行语句 ALTER TABLE <table> REBUILD 重新生成该堆。

  • 在升级后禁用使用 SOUNDEX 定义的 CHECK 约束。 若要启用该约束,请运行语句 ALTER TABLE <table> WITH CHECK CHECK CONSTRAINT ALL

  • 包含使用 SOUNDEX 定义的持久化计算列的索引(包括索引视图)无法查询,直到通过运行语句 ALTER INDEX ALL ON <object> REBUILD 重新生成该索引。

示例

以下示例显示了 SOUNDEX 函数及相关的 DIFFERENCE 函数。 在第一个示例中,返回所有辅音字母的标准 SOUNDEX 值。 对 SOUNDEX 和 Smith 运行 Smythe 会返回相同的结果,因为不会包括所有元音字母、字母 y、双写字母和字母 h

SQL
-- Using SOUNDEX  
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe');  

下面是结果集: 对 Latin1_General 排序规则有效。

S530  S530    

DIFFERENCE 函数用于比较 SOUNDEX 模式结果的差异。 以下示例显示两个仅元音字母不同的字符串。 返回的差异为 4(可能的最小差异)。

SQL
-- Using DIFFERENCE  
SELECT DIFFERENCE('Smithers', 'Smythers');  
GO  

下面是结果集: 对 Latin1_General 排序规则有效。

4             

在以下示例中,字符串的辅音字母不同;所以,返回的差异为 2,表示差异更大。

SQL
SELECT DIFFERENCE('Anothers', 'Brothers');  
GO  

下面是结果集: 对 Latin1_General 排序规则有效。

2             

DIFFERENCE (Transact-SQL)

该函数返回一个整数值,用于度量两个不同字符表达式的 SOUNDEX() 值之间的差异。

主题链接图标 Transact-SQL 语法约定

语法

syntaxsql
DIFFERENCE ( character_expression , character_expression )  

 备注

若要查看 SQL Server 2014 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

character_expression
字符数据的字母数字表达式。 character_expression 可以是常量、变量或列。

返回类型

int

备注

DIFFERENCE 比较两个不同的 SOUNDEX 值,并返回一个整数值。 该值用于度量 SOUNDEX 值匹配的程度,范围为 0 到 4。 值为 0 表示 SOUNDEX 值之间的相似性较弱或不相似;4 表示与 SOUNDEX 值非常相似,甚至完全相同。

DIFFERENCE 和 SOUNDEX 具有排序规则敏感度。

示例

本示例的第一部分比较两个非常相似的字符串的 SOUNDEX 值。 对于 Latin1_General 排序规则,DIFFERENCE 返回的值为 4。 示例的第二部分比较两个差异较大的字符串的 SOUNDEX 值,对于 Latin1_General 排序规则,DIFFERENCE 返回的值为 0

SQL
-- Returns a DIFFERENCE value of 4, the least possible difference.  
SELECT SOUNDEX('Green'), SOUNDEX('Greene'), DIFFERENCE('Green','Greene');  
GO  
-- Returns a DIFFERENCE value of 0, the highest possible difference.  
SELECT SOUNDEX('Blotchet-Halls'), SOUNDEX('Greene'), DIFFERENCE('Blotchet-Halls', 'Greene');  
GO  

下面是结果集:

----- ----- -----------   
G650  G650  4             
  
(1 row(s) affected)  
  
----- ----- -----------   
B432  G650  0             
  
(1 row(s) affected)  


Soundex是一种语音算法,利用英文字的读音计算近似值,值由四个字符构成,第一个字符为英文字母,后三个为数字。在拼音文字中有时会有会念但不能拼出正确字的情形,可用Soundex做类似模糊匹配的效果。

之前做过模糊匹配,用的是正则表达式。但显然,用签名算法的效率更高。

算法简要说明

  • 将英文字按以下规则替换(除第一个字符外):
   a e h i o u w y -> 0
   b f p v -> 1
   c g j k q s x z -> 2
   d t -> 3
   l -> 4
   m n -> 5
   r -> 6
  • 去除0,对于重复的字符只保留一个
  • 返回前4个字符,不足4位以0补足

以Knuth和Kant为例:

   Knuth -> K5030 -> K53 -> K530
   Kant  -> K053  -> K53 -> K530
原文地址:https://www.cnblogs.com/purple5252/p/14003748.html