Sql 计算字段中的位数

Sql 计算字段中的位数,sql,regex,sql-server-2008,Sql,Regex,Sql Server 2008,我使用的是Sql Serevr 2008 如何计算数据库字段中的位数,大致如下: select headline, REGEXP_count(name,'\d') as num_count from accountTbl where num_count > 3; 我试图检测是否有人在标题文本中写了超过3个数字 例如,我想抓住: 'hello call me on 3 4 5 6 7 8' - match 'this is my number 234875' - match

我使用的是Sql Serevr 2008

如何计算数据库字段中的位数,大致如下:

select headline,
       REGEXP_count(name,'\d') as num_count
from accountTbl
where num_count > 3;
我试图检测是否有人在标题文本中写了超过3个数字

例如,我想抓住:

'hello call me on 3 4 5 6 7 8' - match

'this is my number 234875' - match

'4 hello 4 and 66' - match

'leaving on the 24th going to be there at 6:30' - match

SQL Server 2008不支持正则表达式;仅支持模式。您可以使用这样的查询来查找三位数或更多的匹配项:

select headline
from accountTbl
where patindex('%[0-9]%[0-9]%[0-9]%', headline) > 0
你不会得到计数,但你可以过滤。这种解决方案的缺点是,为了搜索(比如)五位数字,您需要更改模式本身


我能想到的在SQL Server 2008中如何计算字符串中的数字的最简单方法是计算原始字符串的长度与所有数字字符(0..9)剥离时字符串长度之间的差值。您的查询可以大致如下所示:

(LEN(headline) * 10) - LEN(REPLACE(headline, '0', '') + 
                           REPLACE(headline, '1', '') +
                           REPLACE(headline, '2', '') +
                           REPLACE(headline, '3', '') +
                           REPLACE(headline, '4', '') +
                           REPLACE(headline, '5', '') +
                           REPLACE(headline, '6', '') +
                           REPLACE(headline, '7', '') +
                           REPLACE(headline, '8', '') +
                           REPLACE(headline, '9', ''))
您应该测试,首先计算每个替换或连接字符串的长度,然后再计算所有字符串的长度是否更快,但是如果字符串不是特别长,那么这两种方法在性能方面应该非常相同。另一个不连接的更难阅读的版本可能是:

LEN(headline) - 
  LEN(REPLACE(
        REPLACE(
          REPLACE(
            REPLACE(
              REPLACE(
                 REPLACE(
                   REPLACE(
                     REPLACE(
                       REPLACE(
                         REPLACE(headline, '9', ''), 
                       '8', ''), 
                     '7', ''), 
                  '6', ''), 
                '5', ''), 
              '4', ''), 
            '3', ''), 
          '2', ''), 
        '1', ''), 
      '0', ''))
但我不太确定它是否能在视觉上更吸引人(SQLServer2008真的可以使用正则表达式)。如果您需要一种方法来确定字符串中的位数,那么另一种方法值得考虑


干杯

更新的问题来解释更多是固定的,还是您计划寻找更多的数字?有一个黑客可以让你这么做,但表达式需要更改。它可以是任意数字,但将其固定为3或4以找到一个简单的解决方案将是伟大的-但它需要高效,因为我需要在一个有数百万行的表上运行它使用CLR regexp功能讨论非常好,快速和简单的解决方案!如果需要,可以使用动态SQL将其调整为所需的位数。不确定数百万行的速度,但可以用于获取计数。它看起来真漂亮!