Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql将整数拆分为数字_Sql_Sql Server 2008 - Fatal编程技术网

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为此,必须使用递归算法。我会在我的答案中更新它,但你必须简化它得到答案。对不起,你所说的简化它得到答案是什么意思?