2

我正在使用 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
4

2 回答 2

4

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

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

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

这是关于 sqlfiddle 的快速演示。

于 2013-02-09T11:28:35.493 回答
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 真的可以使用正则表达式)。另一种值得考虑的方法是,如果您需要一种方法来确定字符串中的位数,请参阅此博客

干杯! ;)

于 2013-02-09T11:48:47.567 回答