本例返回所有AddressLine1列包含单词“Olive”的行。在单词左右都有通配符(之间没有空格),这里的“Olive”单词还能嵌入在其他单词中。这个模式还能使用不同的通配符。有关通配符的完整信息请参阅1.3.5节。
8.3.5 检测字符串相似度
DIFFERENCE和SOUNDEX两个函数都是和字符串配合使用,用于根据英语发音规则来评价字符串的发音相似度。SOUNDEX为字符串分配4个数字的代码,然后DIFFERENCE计算两个字符串的SOUNDEX输出之间的相似级别。 DIFFERENCE返回0到4的值,4表示最相近的匹配。
本例演示了如何识别发音相似的字符串——首先独立运算字符串,然后成对进行比较:
这个查询返回:
然后使用DIFFERENCE比较字符串对:
然后,比较另外一对:
这个查询返回:
解析
在第一个示例中,使用SOUNDEX来评价4个发音相似的单词。查询返回了一个4位代码,“Fleas”和“Fleece”等于F420,而“Peace”和“Peas”等于P200。
在第二个示例中,用DIFFERENCE来评价“Fleas”和“Fleece”以及
“Fleece”和“Peace”。结果得出“Fleas”和“Fleece”的值为4,“Fleece”和“Peace”的值为2,前者比后者更相似。
8.3.6 获取字符串最左和最右部分
LEFT函数返回字符串左起指定字符个数的一部分。RIGHT函数和LEFT函数相似,只是它返回字符串右起指定字符个数的一部分。
这个技巧演示如何返回字符串最左和最右部分的子集。而且,还演示了使用这些函数进行的常见的字符串填充技巧。
在第一个示例中,从字符串获取最左边的10个字符:
这个查询返回:
接着,获取字符串最右边的10个字符:
这个查询返回:
下面的示例演示使用0填充ListPrice列的值:
为了业务目的需要填充数字
这个查询返回:
解析
这个技巧演示了使用LEFT和RIGHT的3个示例。前两个示例演示了返回字符串值的最左边和最右边的一些字符。
第三个示例演示了填充字符串以符合某个期望的业务格式。如果要把数据展现给终端用户或者把数据导出到外部系统,有的时候你可能需要保留或者增加前导值,比如前导0来得到固定长度的数字。要为ListPrice填充0首先需要为转换为varchar(10)的ListPrice值在前面连接10个0。然后,在这个连接的外面,使用RIGHT来提取连接后字符串中最后10个字符(因此,如果ListPrice不到10个数字,在左边就填充了前导的0):
8.3.7 检测字符串中的字符数或者字节数
LEN函数返回字符串表达式中的字符个数,不包含最后一个字符后的任何空格(尾部空格)。而DATALENGTH返回表达式使用的字节数。在本技巧中,我会演示如何测量字符串中的字符数和字节数。
第一个示例返回字符串中的字符数:
这个查询返回:
下面的示例返回字符串中的字节数。
这个查询返回:
解析
这个技巧使用了Unicode字符串,它通过给字符串加前缀N来定义,如下所示:
根据LEN,字符串中的字符数为38,然而由于它是Unicode字符串,DATALENGTH返回76个字节。Unicode数据的每个字符占2个字节,而非Unicode只占1个字节。
8.3.8 把字符串的一部分替换成另一个字符串
REPLACE函数将某个字符串中的指定字符串的所有实例替换为一个新的字符串。REPLACE的一个好处在于它不像PATINDEX和CHARINDEX只返回找到模式的某个位置,REPLACE能找到某个字符串中的一个模式的多个实例。 REPLACE的语法如下:
第一个字符串表达式参数是需要修改的字符串。第二个字符串表达式是需要从第一个字符串参数中移除的字符串。第三个字符串表达式是要插入到第一个参数中的字符串。
这个示例演示了如何将指定字符串的所有示例替换为一个新串:
这个查询返回:
解析
在这个技巧中,第一个字符串表达式是需要搜索的字符串“Zenon is our major profit center. Zenon leads the way”。第二个表达式是要替换的表达式(“Zenon”)。第三个表达式是替代“Zenon”的值“Xerxes”。
8.3.9 把字符串填充到字符串中
STUFF函数删除某个长度的字符并在指定的起始位置插入指定的字符串。语法如下:
这个函数的第一个参数是要修改的字符表达式。第二个参数是要插入字符串的起始位置。length是要在字符表达式中删除的字符数。第四个参数是你希望插入的实际字符表达式。
本例替换了字符串的一部分并在字符串内插入一个新的表达式:
这个查询返回:
解析
本技巧中的字符表达式是“My cat’s name is X. Have you met him?”。起始值是18,也就是说替换会发生在字符串中的第18个位置(在这里是X)。长度值是1,也就是从位置18开始的1个字符会被删除。最后一个字符表达式是Edgar,它就是要填充到字符串中的值。
8.3.10 把字符值转化为小写、大写以及合适的大小写
LOWER函数返回字符表达式的小写形式,UPPER函数返回字符表达式的大写形式。没有内建的合适大小写的函数,所以在本技巧中会演示一个用户定义函数。
在看这些不同的函数之前,我写了一个查询来显示Production.Document表中某行的Document- Summary值:
这个查询返回下面的句子大小写值:
第一个示例演示了把值设置为小写:
这个查询返回: