sql将整数拆分为数字
我有这样的输入sql将整数拆分为数字,sql,sql-server-2008,Sql,Sql Server 2008,我有这样的输入4541或45或124 我想将输入拆分为如下数字: 如果输入是1235,我想取1,2,3,5 我试着在谷歌上搜索,但我发现的所有东西都是将数字从浮点数拆分,或者将字符串改为数字 你能帮忙吗?你需要把它当作一个字符串。然后可以使用子字符串来获取每个字符 DECLARE @str VARCHAR(50) DECLARE @i INT DECLARE @len INT DECLARE @char VARCHAR(50) DECLARE @result VARCHAR(50) SET @
4541
或45
或124
我想将输入拆分为如下数字:
如果输入是1235
,我想取1
,2
,3
,5
我试着在谷歌上搜索,但我发现的所有东西都是将数字从浮点数拆分,或者将字符串改为数字
你能帮忙吗?你需要把它当作一个字符串。然后可以使用子字符串来获取每个字符
DECLARE @str VARCHAR(50)
DECLARE @i INT
DECLARE @len INT
DECLARE @char VARCHAR(50)
DECLARE @result VARCHAR(50)
SET @str = '1235'
SET @i = 1
SET @len = LEN(@str)
WHILE @i<= @len
BEGIN
SET @char = SUBSTRING(@str, @i, 1)
@result = @char + ", "
SET @i=@i+1
END
DECLARE@str VARCHAR(50)
声明@i INT
声明@lenint
声明@char VARCHAR(50)
声明@result VARCHAR(50)
SET@str='1235'
设置@i=1
设置@len=len(@str)
而@i方法1:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SplitIntoIndividualLetters]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[SplitIntoIndividualLetters]
GO
CREATE FUNCTION [dbo].[SplitIntoIndividualLetters](@Str varchar(8000))
Returns @Lettertable TABLE (letters varchar(8000))
AS
Begin
;With NumCte As
(
Select Number = 1 Union All
Select Number +1 From NumCte
Where Number < 1000
)
Insert Into @Lettertable(letters)
Select Substring(@str,Number,1)
From NumCte
where Number Between 1 And Len(@str)
Option (Maxrecursion 0)
Return
End
1,2,3,4,5
SELECT dbo.fnIntegerToWords(5) As Word
Word
Five
试试这个
Declare @str Varchar(50) = '12345'
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' ,'') + dbo.fnIntegerToWords(letters)
FROM dbo.SplitIntoIndividualLetters(@str)
SELECT @listStr
功能:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SplitIntoIndividualLetters]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[SplitIntoIndividualLetters]
GO
CREATE FUNCTION [dbo].[SplitIntoIndividualLetters](@Str varchar(8000))
Returns @Lettertable TABLE (letters varchar(8000))
AS
Begin
;With NumCte As
(
Select Number = 1 Union All
Select Number +1 From NumCte
Where Number < 1000
)
Insert Into @Lettertable(letters)
Select Substring(@str,Number,1)
From NumCte
where Number Between 1 And Len(@str)
Option (Maxrecursion 0)
Return
End
1,2,3,4,5
SELECT dbo.fnIntegerToWords(5) As Word
Word
Five
输出:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SplitIntoIndividualLetters]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[SplitIntoIndividualLetters]
GO
CREATE FUNCTION [dbo].[SplitIntoIndividualLetters](@Str varchar(8000))
Returns @Lettertable TABLE (letters varchar(8000))
AS
Begin
;With NumCte As
(
Select Number = 1 Union All
Select Number +1 From NumCte
Where Number < 1000
)
Insert Into @Lettertable(letters)
Select Substring(@str,Number,1)
From NumCte
where Number Between 1 And Len(@str)
Option (Maxrecursion 0)
Return
End
1,2,3,4,5
SELECT dbo.fnIntegerToWords(5) As Word
Word
Five
方法2:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SplitIntoIndividualLetters]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[SplitIntoIndividualLetters]
GO
CREATE FUNCTION [dbo].[SplitIntoIndividualLetters](@Str varchar(8000))
Returns @Lettertable TABLE (letters varchar(8000))
AS
Begin
;With NumCte As
(
Select Number = 1 Union All
Select Number +1 From NumCte
Where Number < 1000
)
Insert Into @Lettertable(letters)
Select Substring(@str,Number,1)
From NumCte
where Number Between 1 And Len(@str)
Option (Maxrecursion 0)
Return
End
1,2,3,4,5
SELECT dbo.fnIntegerToWords(5) As Word
Word
Five
我想出了解决办法:
DECLARE @str VARCHAR(50),@Inc INT,@len INT,@char VARCHAR(50)
SET @str = '12345'
SET @Inc = 1
SET @len = LEN(@str)
WHILE @Inc<= @len
BEGIN
SET @char = COALESCE(@char+',' ,'') + SUBSTRING(@str, @Inc, 1)
SET @Inc=@Inc+1
END
SELECT @char
从数字到单词的转换
CREATE FUNCTION fnIntegerToWords(@Number as BIGINT)
RETURNS VARCHAR(1024)
AS
BEGIN
DECLARE @Below20 TABLE (ID int identity(0,1), Word varchar(32))
DECLARE @Below100 TABLE (ID int identity(2,1), Word varchar(32))
INSERT @Below20 (Word) VALUES
( 'Zero'), ('One'),( 'Two' ), ( 'Three'),
( 'Four' ), ( 'Five' ), ( 'Six' ), ( 'Seven' ),
( 'Eight'), ( 'Nine'), ( 'Ten'), ( 'Eleven' ),
( 'Twelve' ), ( 'Thirteen' ), ( 'Fourteen'),
( 'Fifteen' ), ('Sixteen' ), ( 'Seventeen'),
('Eighteen' ), ( 'Nineteen' )
INSERT @Below100 VALUES ('Twenty'), ('Thirty'),('Forty'), ('Fifty'),
('Sixty'), ('Seventy'), ('Eighty'), ('Ninety')
declare @belowHundred as varchar(126)
if @Number > 99 begin
select @belowHundred = dbo.fnIntegerToWords( @Number % 100)
end
DECLARE @English varchar(1024) =
(
SELECT Case
WHEN @Number = 0 THEN ''
WHEN @Number BETWEEN 1 AND 19
THEN (SELECT Word FROM @Below20 WHERE ID=@Number)
WHEN @Number BETWEEN 20 AND 99
THEN (SELECT Word FROM @Below100 WHERE ID=@Number/10)+ '-' +
dbo.fnIntegerToWords( @Number % 10)
WHEN @Number BETWEEN 100 AND 999
THEN (dbo.fnIntegerToWords( @Number / 100)) +' Hundred '+
Case WHEN @belowHundred <> '' THEN 'and ' + @belowHundred else @belowHundred end
WHEN @Number BETWEEN 1000 AND 999999
THEN (dbo.fnIntegerToWords( @Number / 1000))+' Thousand '+
dbo.fnIntegerToWords( @Number % 1000)
WHEN @Number BETWEEN 1000000 AND 999999999
THEN (dbo.fnIntegerToWords( @Number / 1000000))+' Million '+
dbo.fnIntegerToWords( @Number % 1000000)
WHEN @Number BETWEEN 1000000000 AND 999999999999
THEN (dbo.fnIntegerToWords( @Number / 1000000000))+' Billion '+
dbo.fnIntegerToWords( @Number % 1000000000)
ELSE ' INVALID INPUT' END
)
SELECT @English = RTRIM(@English)
SELECT @English = RTRIM(LEFT(@English,len(@English)-1))
WHERE RIGHT(@English,1)='-'
RETURN (@English)
END
以逗号分隔的列表获取答案
试试这个
Declare @str Varchar(50) = '12345'
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' ,'') + dbo.fnIntegerToWords(letters)
FROM dbo.SplitIntoIndividualLetters(@str)
SELECT @listStr
输出:
1,2,3,4,5
不需要像其他人那样声明那么多变量,这很简单。这对我来说很有用:试试看
declare @intvalue int
declare @incremnt int
declare @data varchar(20)
set @intvalue = 1234
set @data = CAST(@intvalue as varchar(10))
set @incremnt = 1
while(LEN(@data) >= @incremnt)
begin
select SUBSTRING(@data,@incremnt,1)
set @incremnt = @incremnt + 1
end
位数是否总是4???@apomene否不总是4
,我给了你一些例子,它可以是任何长度。这个数字总是正的?这是什么目的?你打算如何使用结果?您是否只需要在单个结果中使用逗号分隔的列表?或者单独列或行的结果会更好吗?另外,您希望它是存储在存储过程/函数中,还是只存储在直接的sql中solution@MeysamTolouee是的,我需要测试它,但是你是如何将整数改为字符串的?你只需要在它周围加上引号“,”或“”。我遇到了这些错误必须声明标量变量“@string”。
和必须声明标量变量“@char”.
我已经添加了上面的声明。您肯定能够自己完成吗?谢谢您的回答,我正在尝试上面的答案,然后我将尝试您的答案。在第二种方法中,有没有一种方法可以代替返回1,2,3,4
来返回1234
?我可以自己做,我只需要你告诉我如何在你的中提取单独的数字,而是的,但我不想让你感觉到它的画意,我只想让你(如果你愿意的话)告诉我如何在你的while语句中提取单独的数字,例如1
或2
我会将其更改为text@MarcoDinatsoli为此,必须使用递归算法。我会在我的答案中更新它,但你必须简化它得到答案。对不起,你所说的简化它得到答案是什么意思?