计算字段中的位数

时间:2013-02-09 11:08:38

标签: 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

'4 hello 4 and 66' - match

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

2 个答案:

答案 0 :(得分:4)

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

select headline
from accountTbl
where patindex('%[0-9]%[0-9]%[0-9]%', headline) > 0

你不会得到计数,但你可以过滤。此解决方案的缺点是,为了搜索五位数,您需要更改模式本身。

Here is a quick demo on sqlfiddle.

答案 1 :(得分:1)

我能想到如何计算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', ''))

但是我不太确定它是否会使它更具视觉吸引力(SQL Server 2008可以真正使用正则表达式)。另一种值得考虑的方法,如果您需要一种方法来确定字符串is described in this blog中的位数。

干杯! ;)