2011-08-04 25 views
2
提取了一些

我有以下字符串:從字符串在SQL

「FLEETWOOD DESIGNS 535353110XXXXX」(x是實際數字我只是想在這裏隱藏)

有誰知道我怎麼能搜索通過SQL中的字符串並提取更大的數字,然後可以說10個字符長?

+1

什麼數據庫來完成引擎你在用嗎? –

+0

所以這些數字可能不是每次都在相同的位置? –

+0

數字可以在任何地方,字符串會更大。我正在使用SQLSERVER 2008 – JBone

回答

0

你不提數據庫引擎,所以我們不知道是什麼功能都可以...

如果regexpressions可用,那麼像\d{10,}模式將匹配有10個以上數字。

在MySQL REGEXP只能返回true或false(0或1),所以你不得不使用一些醜陋的黑客就像

SELECT 
    LEAST(
    INSTR(field,'0'), 
    INSTR(field,'1'), 
    INSTR(field,'2'), 
    INSTR(field,'3'), 
    INSTR(field,'4'), 
    INSTR(field,'5'), 
    INSTR(field,'6'), 
    INSTR(field,'7'), 
    INSTR(field,'8'), 
    INSTR(field,'9') 
) AS startPos, 
    REVERSE(field) AS backward, 
    LEAST(
    INSTR(backward,'0'), 
    INSTR(backward,'1'), 
    INSTR(backward,'2'), 
    INSTR(backward,'3'), 
    INSTR(backward,'4'), 
    INSTR(backward,'5'), 
    INSTR(backward,'6'), 
    INSTR(backward,'7'), 
    INSTR(backward,'8'), 
    INSTR(backward,'9') 
) AS endPos, 
    SUBSTRING(field, startPos, endPos - startPos + 1) 
FROM tab 
WHERE(field REGEXP '[0-9]{10,}') 

但這並不是完美的 - 它會提取字符串假子比如「ABC 9 A 1234567891」,更不用說它可能是如此懶散,以至於手工傳送數據會更快。

0
SUBSTRING('FLEETWOOD DESIGNS 535353110XXXXX', 18, 32) 

你也可以使用LEN()獲得字符串本身的長度。如果您知道序列號的長度,您可以從結束索引中減去該序列號以獲取子字符串的起始索引。

+0

好主意,但是這個數字可能位於字符串中的任何位置 – JBone

1

這是一個很老的帖子,但可能會幫助其他人。我正在尋找SQL Server中的用戶定義函數,以僅提取給定字符串的數字,而且,令人驚訝的是我找不到我正在尋找的東西。

讓我把函數的代碼放在「從SQL中的字符串中提取數字」(適用於SQL Server)。這是從Pinal Dave的夢幻般的博客,我已經修改它只是爲了返回NULL是一個NULL值傳遞給函數。

CREATE FUNCTION [dbo].[ExtractInteger](@String VARCHAR(2000)) 
    RETURNS VARCHAR(1000) 
AS 
BEGIN 
    DECLARE @Count INT 
    DECLARE @IntNumbers VARCHAR(1000) 
    SET @Count = 0 
    SET @IntNumbers = '' 

    IF @String IS NULL 
     RETURN NULL; 

    WHILE @Count <= LEN(@String) 
    BEGIN 
     IF SUBSTRING(@String,@Count,1) >= '0' AND SUBSTRING(@String,@Count,1) <= '9' 
     BEGIN 
      SET @IntNumbers = @IntNumbers + SUBSTRING(@String,@Count,1) 
     END 
     SET @Count = @Count + 1 
    END 

    RETURN @IntNumbers 
END 

測試

select '"' + dbo.ExtractInteger('1a2b3c4d5e6f7g8h9i') + '"' 
GO 
select '"' + dbo.ExtractInteger('abcdefghi') + '"' 
GO 
select '"' + dbo.ExtractInteger(NULL) + '"' 
GO 
select '"' + dbo.ExtractInteger('') + '"' 
GO 

結果

"123456789" 
"" 
NULL 
"" 
0

它可以像這樣

Declare @X  varchar(100) 
Select  @X= 'Here is where15234Numbers' 
-- 
Select  @X= SubString(@X,PATINDEX('%[0-9]%',@X),Len(@X)) 
Select  @X= SubString(@X,0,PATINDEX('%[^0-9]%',@X)) 
--// show result 
Select  @X