计算字符模式匹配

时间:2014-04-29 15:39:57

标签: sql tsql sql-server-2008-r2

是否可以使用纯SQL来计算以下字符串中x的数量?

708258761XXXXXXXX00A  
708232761XXXXXXXXXXA

与前面的字符串

运行时的结果
8
10

我可以轻松地在代码中执行此操作,但我正在寻找一种纯T-SQL方法来执行此操作。

根据我正在查看的产品,该模式将具有不同数量的X

换句话说,我正在寻找的是一种纯SQL方式来计算模式的匹配数。

在上面的示例中,输入模式为X。使用另一个示例,搜索模式为Ted,以下内容可能会返回3的值:

  特德是泰德,因为泰德太棒了!

2 个答案:

答案 0 :(得分:2)

我添加了一个名为@pattern的变量来存储搜索模式字符串。

通过删除模式的每个实例,确定删除的字符数,然后将删除的字符数除以搜索模式的长度来计算匹配数。

DECLARE @pattern varchar(20) = 'Ted'

SELECT (Len(ColumnToSearch) - Len(Replace(ColumnToSearch, @pattern, ''))) / Len(@pattern)
AS Number_Of_Matches
FROM MyTable

如果您需要经常进行此计算,可以基于此轻松创建一个函数。

答案 1 :(得分:2)

Adam Porad给出了很好的答案,但没有忘记LEN不计算尾随空格:

DECLARE @pattern varchar(20) = 'Ted ';
SELECT LEN(@pattern) -- return 3

改为使用DATALENGTH:

DECLARE @pattern varchar(20) = 'Ted ';
DECLARE @ColumnToSearch VARCHAR(1000) = 'Ted is Ted because Ted is awesome!';

SELECT (DATALength(@ColumnToSearch) - DATALength(Replace(@ColumnToSearch, @pattern, ''))) / DATALength(@pattern),
       (Len(@ColumnToSearch) - Len(Replace(@ColumnToSearch, @pattern, ''))) / Len(@pattern),
       (Len(@ColumnToSearch) - Len(Replace(@ColumnToSearch, @pattern, ''))),
       Len(@ColumnToSearch),
       Len(@pattern)
AS Number_Of_Matches