我正在考虑从SQL中的单个文本字符串中提取两个数值(我相信2012版)。
字符串采用以下可能的格式:
main
或
A1234 B4567
或
的随机变体A:1234 B:4567
理想情况下,我会使用子串和charindex的组合,但因为符号/空格/什么都没有随机使用我发现它很难。 我的首选输出是2列,一个是[NumberString1],一个是[Numberstring2]
任何想法的人?
答案 0 :(得分:1)
您可以尝试使用此方法,它会为您提供所有数字组的列表。然后,您可以从结果表中进行选择。
CREATE FUNCTION [dbo].[ParseOutNumbers](@inputText varchar(1000))
RETURNS @ParsedValues TABLE (ID int IDENTITY(1,1),numVal varchar(1000))
AS
BEGIN
DECLARE @charIndex INT
DECLARE @number varchar(1000)
DECLARE @nextChar varchar(1000)
SELECT @charIndex = 1
SELECT @number = ''
WHILE @charIndex <= LEN(@inputText)
BEGIN
SELECT @nextChar = SUBSTRING(@inputText, @charIndex, 1);
IF ISNUMERIC(@nextChar) = 1
BEGIN
SELECT @number = @number + @nextChar
END
IF (ISNUMERIC(@nextChar) = 0 OR @charIndex = LEN(@inputText))
BEGIN
IF (LEN(@number) > 0)
BEGIN
INSERT @ParsedValues(numVal) VALUES(@number)
SELECT @number = ''
END
END
SELECT @charIndex = @charIndex + 1
END
RETURN
END
GO
select * from [dbo].[ParseOutNumbers]('A/d11222Bdd:22002 C23002')
select * from [dbo].[ParseOutNumbers]('A:11222 B:22002 C:23002')
select * from [dbo].[ParseOutNumbers]('A112442B22502C3002')
替代版本:
CREATE FUNCTION [dbo].[ParseOutNumbersRev2](@inputText varchar(1000))
RETURNS @ParsedValues TABLE (A varchar(1000), B varchar(1000))
AS
BEGIN
DECLARE @charIndex INT
DECLARE @number varchar(1000)
DECLARE @nextChar varchar(1000)
DECLARE @valueIndex INT
SELECT @charIndex = 1
SELECT @number = ''
SELECT @valueIndex = 0
WHILE @charIndex <= LEN(@inputText)
BEGIN
SELECT @nextChar = SUBSTRING(@inputText, @charIndex, 1);
IF ISNUMERIC(@nextChar) = 1
BEGIN
SELECT @number = @number + @nextChar
END
IF (ISNUMERIC(@nextChar) = 0 OR @charIndex = LEN(@inputText))
BEGIN
IF (LEN(@number) > 0)
BEGIN
IF (@valueIndex = 0)
BEGIN
INSERT @ParsedValues(A, B) VALUES(@number, null)
END
ELSE IF (@valueIndex = 1)
BEGIN
UPDATE @ParsedValues SET B = @number
END
SELECT @number = ''
SELECT @valueIndex = @valueIndex + 1
END
END
SELECT @charIndex = @charIndex + 1
END
RETURN
END
GO
select * from [dbo].[ParseOutNumbersRev2]('A/d11222Bdd:22002 C23002')
select * from [dbo].[ParseOutNumbersRev2]('A:11222 B:56 C:23002')
select * from [dbo].[ParseOutNumbersRev2]('A112442B22502C3002')