模式匹配
SQL Server暂时不支持正则表达式,只能够通过LIKE与PATINDEX来完成匹配。SQL Server 2000的优化器只能够利用通用的搜索选择性估计,SQL Server 2005的优化器会对子字符串建立统计,这样可以获得更加精确的选择性估计。因此,即使在包含通配符的情况,SQL Server 2005也能够使用索引。
例如,如下的两个SQL语句,他们的作用都是用来寻找所有CustomerID以字母A开头的项:
SELECT CustomerID, CompanyName, Country
FROM dbo.Customers
WHERE LEFT(CustomerID, 1) = N'A';
SELECT CustomerID, CompanyName, Country
FROM dbo.Customers
WHERE CustomerID LIKE N'A%';
在上例中,LIKE语句将会利用索引来优化执行效率,而LEFT却不会利用索引。
由于LIKE只提供了一个基本的模式匹配,因此很多情况下我们需要采用一些特定的方法来匹配。
例如,当需要匹配固定长度的由数字组成的字符串时,我们可以采用如下表达式:
sn LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
当我们需要匹配不定长度的由数字组成的短字符串时,我们可以采用如下表达式:
sn LIKE REPLICATE('[0-9]', LEN(sn))
倘若字符串娇长,我们可以尝试从反面来考虑这个问题:
sn NOT LIKE '%[^0-9]%'
大小写敏感性
SQL Server的大小写敏感性由数据的collation属性决定。例如如下的搜索中包含了一个大小写敏感的条件:
SELECT CustomerID, CompanyName, Country
FROM dbo.Customers
WHERE CustomerID COLLATE Latin1_General_CS_AS = N'ALFKI';
但是在上述表达式中,系统并不能有效地利用数据库的索引。通常,我们可以增加一个非大小写敏感的限制条件来强迫优化器使用数据库索引:
SELECT CustomerID, CompanyName, Country
FROM dbo.Customers
WHERE CustomerID COLLATE Latin1_General_CS_AS = N'ALFKI' AND CustomerID = N'ALFKI';
上述表达式中,优化器会首先利用索引执行非大小写敏感的限制搜索CustomerID = N'ALFKI',接着再从结果中搜索大小写敏感的结果。