从SQL中的String中提取一个数字

时间:2011-08-04 20:42:03

标签: sql string

我有以下字符串:

“FLEETWOOD DESIGNS 535353110XXXXX”(X实际上是我想在这里隐藏它们的数字)

有谁知道如何在SQL中搜索字符串并提取大于10个字符长的数字?

4 个答案:

答案 0 :(得分: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
""

答案 1 :(得分:0)

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

您还可以使用LEN()来获取字符串本身的长度。如果您知道序列号长度,则可以从结束索引中减去该序列号以获取子字符串的起始索引。

答案 2 :(得分: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”之类的字符串提取错误的子字符串,更不用说它可能是如此懒散以至于手动传输数据会更快。

答案 3 :(得分: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