我有以下字符串:
“FLEETWOOD DESIGNS 535353110XXXXX”(X实际上是我想在这里隐藏它们的数字)
有谁知道如何在SQL中搜索字符串并提取大于10个字符长的数字?
答案 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