2013-02-09 83 views
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 
+0

更新的問題來解釋更多 – 2013-02-09 11:20:51

+0

是固定的3,還是你打算尋找更多的數字?有一種黑客可以讓你這樣做,但表達式需要改變。 – dasblinkenlight 2013-02-09 11:21:52

+0

它可以是任意數字的數字,但將其固定爲3或4以找到簡單的解決方案將是很好的 - 但它需要高效,因爲我需要在具有數百萬行的表上運行它 – 2013-02-09 11:24:36

回答

4

SQL Server 2008不支持正則表達式;只支持模式。您可以使用這樣的查詢找到三位或更多的比賽:

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

你不會得到計數,但你將能夠過濾。這個解決方案的缺點是,爲了搜索5位數字,你需要改變模式本身。

Here is a quick demo on sqlfiddle.

+0

這樣做的效果非常好,速度很快。謝謝! – 2013-02-09 11:35:03

+0

非常好,快速和簡單的解決方案!如果需要,可以使用動態SQL將其調整爲所需的位數。 – Serg 2013-02-09 11:45:23

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中的數字位數。

乾杯! ;)

+0

不知道數百萬行的速度,但可用於計數。它確實看起來很漂亮! – 2013-02-09 12:06:29