Convert number to words - first, second, third and so on

前端 未结 5 1196
清酒与你
清酒与你 2020-12-09 12:43

Does anyone know how if it\'s possible to take an integer variable in SQL and convert it to the equivilent number of the form: First, Second, Third, Fourth etc?

Than

相关标签:
5条回答
  • 2020-12-09 13:01

    This seems like a simpler approach, a nice recursive algorithm

    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 
    
    0 讨论(0)
  • 2020-12-09 13:02

    Also, you can CREATE TABLE with numbers and their names.

    CREATE TABLE tblNumbers (Nmb int, NmbWord varchar(100))
    INSERT INTO tblNumbers 
    VALUES (1,'first'), (2,'second'),(3,'third'), (4,'forth')
    
    CREATE TABLE SomeTable (nmb int)
    
    INSERT INTO SomeTable 
    VALUES (1), (1),(2),(3)
    
    SELECT  N.*
    FROM tblNumbers N
         JOIN SomeTable ST ON ST.nmb=N.Nmb
    
    DROP TABLE tblNumbers
    DROP TABLE SomeTable
    
    0 讨论(0)
  • 2020-12-09 13:16

    This should work up to 999...

    IF OBJECT_ID('tempdb..#numbers_list') IS NOT NULL DROP TABLE #numbers_list
    CREATE TABLE #numbers_list (int_value INT, text_value VARCHAR(100))
    INSERT INTO #numbers_list
    SELECT 1 as int_value, 'One' as text_value UNION ALL
    SELECT 2 as int_value, 'Two' as text_value UNION ALL
    SELECT 3 as int_value, 'Three' as text_value UNION ALL
    SELECT 4 as int_value, 'Four' as text_value UNION ALL
    SELECT 5 as int_value, 'Five' as text_value UNION ALL
    SELECT 6 as int_value, 'Six' as text_value UNION ALL
    SELECT 7 as int_value, 'Seven' as text_value UNION ALL
    SELECT 8 as int_value, 'Eight' as text_value UNION ALL
    SELECT 9 as int_value, 'Nine' as text_value UNION ALL
    SELECT 10 as int_value, 'Ten' as text_value UNION ALL
    SELECT 11 as int_value, 'Eleven' as text_value UNION ALL
    SELECT 12 as int_value, 'Twelve' as text_value UNION ALL
    SELECT 13 as int_value, 'Thirteen' as text_value UNION ALL
    SELECT 14 as int_value, 'Fourteen' as text_value UNION ALL
    SELECT 15 as int_value, 'Fifteen' as text_value UNION ALL
    SELECT 16 as int_value, 'Sixteen' as text_value UNION ALL
    SELECT 17 as int_value, 'Seventeen' as text_value UNION ALL
    SELECT 18 as int_value, 'Eighteen' as text_value UNION ALL
    SELECT 19 as int_value, 'Nineteen' as text_value UNION ALL
    SELECT 20 as int_value, 'Twenty' as text_value UNION ALL
    SELECT 30 as int_value, 'Thirty' as text_value UNION ALL
    SELECT 40 as int_value, 'Fourty' as text_value UNION ALL
    SELECT 50 as int_value, 'Fifty' as text_value UNION ALL
    SELECT 60 as int_value, 'Sixty' as text_value UNION ALL
    SELECT 70 as int_value, 'Seventy' as text_value UNION ALL
    SELECT 80 as int_value, 'Eighty' as text_value UNION ALL
    SELECT 90 as int_value, 'Ninety' as text_value UNION ALL
    SELECT 100 AS int_value, 'One Hundred' AS text_value
    
    SELECT 
    tst2.number
    ,CASE WHEN exact.text_value IS NOT NULL THEN exact.text_value 
            WHEN tst2.number > 100 AND COALESCE(tens.text_value,ones.text_value) IS NULL THEN hunds.text_value + ' Hundred'
            WHEN tst2.number > 100 AND tst2.number_of_ones = 0 THEN hunds.text_value + ' Hundred And ' + tens.text_value
            WHEN tst2.number > 100 AND tst2.number_of_tens = 0 THEN hunds.text_value + ' Hundred And ' + ones.text_value
            WHEN tst2.number > 100 THEN hunds.text_value + ' Hundred And ' + tens.text_value + ' ' + ones.text_value
            WHEN tst2.number > 10 THEN tens.text_value + ' ' + ones.text_value
    END AS string
    FROM
    (
    SELECT tst.number
    ,tst.number % 10 as number_of_ones
    ,CASE WHEN tst.number < 101 THEN tst.number - (tst.number % 10) 
        WHEN tst.number > 100 THEN tst.number - 100 * (FLOOR(tst.number / 100)) - (tst.number % 10)
    END as number_of_tens
    ,tst.number / 100 as number_of_hundreds
    FROM 
    (
    SELECT 22 as number UNION ALL
    SELECT 27 UNION ALL
    SELECT 10 UNION ALL
    SELECT 101 UNION ALL
    SELECT 200 UNION ALL
    SELECT 227
    ) tst
    ) tst2
    LEFT OUTER JOIN #numbers_list exact on exact.int_value = tst2.number --if an exact match
    LEFT OUTER JOIN #numbers_list ones on ones.int_value = tst2.number_of_ones 
    LEFT OUTER JOIN #numbers_list tens on tens.int_value = tst2.number_of_tens
    LEFT OUTER JOIN #numbers_list hunds on hunds.int_value = tst2.number_of_hundreds
    
    0 讨论(0)
  • 2020-12-09 13:17

    I Just Updated a function in MySql from 999 up to 999999999 number

    this is the link to the original one:Reference

    And the Updated one is bellow:


    CREATE FUNCTION `number_to_string`(n INT) RETURNS varchar(1000) CHARSET latin1 BEGIN
        declare ans varchar(1000);
        declare dig1, dig2, dig3,dig4,dig5,dig6,dig7,dig8,dig9 int;
    
        set ans = '';
        set dig9 = floor(n/100000000);
        set dig8 = floor(n/10000000) - dig9*10;
        set dig7 = floor(n/1000000) -(floor(n/10000000)*10);
        set dig6 = floor(n/100000) - (floor(n/1000000)*10);
        set dig5 = floor(n/10000) -  (floor(n/100000)*10);
        set dig4 = floor(n/1000) -   (floor(n/10000)*10);
        set dig3 = floor(n/100) -    (floor(n/1000)*10);
        set dig2 = floor(n/10) -     (floor(n/100)*10);
        set dig1 = n - (floor(n / 10)*10);
    

    If dig9 > 0 then

            case
                when dig9=1 then set ans=concat(ans, 'One Hundred');
                when dig9=2 then set ans=concat(ans, 'Two Hundred');
                when dig9=3 then set ans=concat(ans, 'Three Hundred');
                when dig9=4 then set ans=concat(ans, 'Four Hundred');
                when dig9=5 then set ans=concat(ans, 'Five Hundred');
                when dig9=6 then set ans=concat(ans, 'Six Hundred');
                when dig9=7 then set ans=concat(ans, 'Seven Hundred');
                when dig9=8 then set ans=concat(ans, 'Eight Hundred');
                when dig9=9 then set ans=concat(ans, 'Nine Hundred');
                else set ans = ans;
            end case;
             if ans <> '' and dig8 =0 and dig7 = 0 then
                set ans=concat(ans, ' Million');
            end if;
        end if;
        if ans <> '' and dig8 > 0 then
            set ans=concat(ans, ' And ');
        end if;
        if dig8 = 1 then
            case
                when (dig8*10 + dig7) = 10 then set ans=concat(ans,'Ten Million');
                when (dig8*10 + dig7) = 11 then set ans=concat(ans,'Eleven Million');
                when (dig8*10 + dig7) = 12 then set ans=concat(ans,'Twelve Million');
                when (dig8*10 + dig7) = 13 then set ans=concat(ans,'Thirteen Million');
                when (dig8*10 + dig7) = 14 then set ans=concat(ans,'Fourteen Million');
                when (dig8*10 + dig7) = 15 then set ans=concat(ans,'Fifteen Million');
                when (dig8*10 + dig7) = 16 then set ans=concat(ans,'Sixteen Million');
                when (dig8*10 + dig7) = 17 then set ans=concat(ans,'Seventeen Million');
                when (dig8*10 + dig7) = 18 then set ans=concat(ans,'Eighteen Million');
                when (dig8*10 + dig7) = 19 then set ans=concat(ans,'Nineteen Million');
                else set ans=ans;
            end case;
        else
            if dig8 > 0 then
                case
                    when dig8=2 then set ans=concat(ans, ' Twenty');
                    when dig8=3 then set ans=concat(ans, ' Thirty');
                    when dig8=4 then set ans=concat(ans, ' Fourty');
                    when dig8=5 then set ans=concat(ans, ' Fifty');
                    when dig8=6 then set ans=concat(ans, ' Sixty');
                    when dig8=7 then set ans=concat(ans, ' Seventy');
                    when dig8=8 then set ans=concat(ans, ' Eighty');
                    when dig8=9 then set ans=concat(ans, ' Ninety');
                    else set ans=ans;
                end case;
                if ans <> '' and dig7 =0 then
                set ans=concat(ans, ' Million');
                end if;
            end if;
            if ans <> '' and dig7 > 0 and dig8 =0 then
            set ans=concat(ans, ' And ');
            end if;
            if dig7 > 0 then
            case
                when dig7=1 then set ans=concat(ans, ' One Million');
                when dig7=2 then set ans=concat(ans, ' Two Million');
                when dig7=3 then set ans=concat(ans, ' Three Million');
                when dig7=4 then set ans=concat(ans, ' Four Million');
                when dig7=5 then set ans=concat(ans, ' Five Million');
                when dig7=6 then set ans=concat(ans, ' Six Million');
                when dig7=7 then set ans=concat(ans, ' Seven Million');
                when dig7=8 then set ans=concat(ans, ' Eight Million');
                when dig7=9 then set ans=concat(ans, ' Nine Million');
                else set ans = ans;
            end case;
        end if;
    end if;
        if ans <> '' and dig6 > 0 then
            set ans=concat(ans, ' And ');
        end if;
    
        if dig6 > 0 then
            case
                when dig6=1 then set ans=concat(ans, 'One Hundred');
                when dig6=2 then set ans=concat(ans, 'Two Hundred');
                when dig6=3 then set ans=concat(ans, 'Three Hundred');
                when dig6=4 then set ans=concat(ans, 'Four Hundred');
                when dig6=5 then set ans=concat(ans, 'Five Hundred');
                when dig6=6 then set ans=concat(ans, 'Six Hundred');
                when dig6=7 then set ans=concat(ans, 'Seven Hundred');
                when dig6=8 then set ans=concat(ans, 'Eight Hundred');
                when dig6=9 then set ans=concat(ans, 'Nine Hundred');
                else set ans = ans;
            end case;
             if ans <> '' and dig4 =0 and dig5 = 0 then
                set ans=concat(ans, ' Thousand');
            end if;
        end if;
        if ans <> '' and dig5 > 0 then
            set ans=concat(ans, ' And ');
        end if;
        if dig5 = 1 then
            case
                when (dig5*10 + dig4) = 10 then set ans=concat(ans,'Ten Thousand');
                when (dig5*10 + dig4) = 11 then set ans=concat(ans,'Eleven Thousand');
                when (dig5*10 + dig4) = 12 then set ans=concat(ans,'Twelve Thousand');
                when (dig5*10 + dig4) = 13 then set ans=concat(ans,'Thirteen Thousand');
                when (dig5*10 + dig4) = 14 then set ans=concat(ans,'Fourteen Thousand');
                when (dig5*10 + dig4) = 15 then set ans=concat(ans,'Fifteen Thousand');
                when (dig5*10 + dig4) = 16 then set ans=concat(ans,'Sixteen Thousand');
                when (dig5*10 + dig4) = 17 then set ans=concat(ans,'Seventeen Thousand');
                when (dig5*10 + dig4) = 18 then set ans=concat(ans,'Eighteen Thousand');
                when (dig5*10 + dig4) = 19 then set ans=concat(ans,'Nineteen Thousand');
                else set ans=ans;
            end case;
        else
            if dig5 > 0 then
                case
                    when dig5=2 then set ans=concat(ans, ' Twenty');
                    when dig5=3 then set ans=concat(ans, ' Thirty');
                    when dig5=4 then set ans=concat(ans, ' Fourty');
                    when dig5=5 then set ans=concat(ans, ' Fifty');
                    when dig5=6 then set ans=concat(ans, ' Sixty');
                    when dig5=7 then set ans=concat(ans, ' Seventy');
                    when dig5=8 then set ans=concat(ans, ' Eighty');
                    when dig5=9 then set ans=concat(ans, ' Ninety');
                    else set ans=ans;
                end case;
                if ans <> '' and dig4 =0 then
                set ans=concat(ans, ' Thousand');
                end if;
            end if;
            if ans <> '' and dig4 > 0 and dig5 =0 then
            set ans=concat(ans, ' And ');
            end if;
            if dig4 > 0 then
            case
                when dig4=1 then set ans=concat(ans, ' One Thousand');
                when dig4=2 then set ans=concat(ans, ' Two Thousand');
                when dig4=3 then set ans=concat(ans, ' Three Thousand');
                when dig4=4 then set ans=concat(ans, ' Four Thousand');
                when dig4=5 then set ans=concat(ans, ' Five Thousand');
                when dig4=6 then set ans=concat(ans, ' Six Thousand');
                when dig4=7 then set ans=concat(ans, ' Seven Thousand');
                when dig4=8 then set ans=concat(ans, ' Eight Thousand');
                when dig4=9 then set ans=concat(ans, ' Nine Thousand');
                else set ans = ans;
            end case;
        end if;
    end if;
        if ans <> '' and dig3 > 0 then
            set ans=concat(ans, ' And ');
        end if;
        if dig3 > 0 then
            case
                when dig3=1 then set ans=concat(ans, 'One Hundred');
                when dig3=2 then set ans=concat(ans, 'Two Hundred');
                when dig3=3 then set ans=concat(ans, 'Three Hundred');
                when dig3=4 then set ans=concat(ans, 'Four Hundred');
                when dig3=5 then set ans=concat(ans, 'Five Hundred');
                when dig3=6 then set ans=concat(ans, 'Six Hundred');
                when dig3=7 then set ans=concat(ans, 'Seven Hundred');
                when dig3=8 then set ans=concat(ans, 'Eight Hundred');
                when dig3=9 then set ans=concat(ans, 'Nine Hundred');
                else set ans = ans;
            end case;
        end if;
        if ans <> '' and dig2 > 0 then
            set ans=concat(ans, ' And ');
        end if;
        if dig2 = 1 then
            case
                when (dig2*10 + dig1) = 10 then set ans=concat(ans,'Ten');
                when (dig2*10 + dig1) = 11 then set ans=concat(ans,'Eleven');
                when (dig2*10 + dig1) = 12 then set ans=concat(ans,'Twelve');
                when (dig2*10 + dig1) = 13 then set ans=concat(ans,'Thirteen');
                when (dig2*10 + dig1) = 14 then set ans=concat(ans,'Fourteen');
                when (dig2*10 + dig1) = 15 then set ans=concat(ans,'Fifteen');
                when (dig2*10 + dig1) = 16 then set ans=concat(ans,'Sixteen');
                when (dig2*10 + dig1) = 17 then set ans=concat(ans,'Seventeen');
                when (dig2*10 + dig1) = 18 then set ans=concat(ans,'Eighteen');
                when (dig2*10 + dig1) = 19 then set ans=concat(ans,'Nineteen');
                else set ans=ans;
            end case;
        else
            if dig2 > 0 then
                case
                    when dig2=2 then set ans=concat(ans, ' Twenty');
                    when dig2=3 then set ans=concat(ans, ' Thirty');
                    when dig2=4 then set ans=concat(ans, ' Fourty');
                    when dig2=5 then set ans=concat(ans, ' Fifty');
                    when dig2=6 then set ans=concat(ans, ' Sixty');
                    when dig2=7 then set ans=concat(ans, ' Seventy');
                    when dig2=8 then set ans=concat(ans, ' Eighty');
                    when dig2=9 then set ans=concat(ans, ' Ninety');
                    else set ans=ans;
                end case;
            end if;
            if ans <> '' and dig1 > 0 and dig2 =0 then
            set ans=concat(ans, ' And ');
            end if;
            if dig1 > 0 then
                case
                    when dig1=1 then set ans=concat(ans, ' One');
                    when dig1=2 then set ans=concat(ans, ' Two');
                    when dig1=3 then set ans=concat(ans, ' Three');
                    when dig1=4 then set ans=concat(ans, ' Four');
                    when dig1=5 then set ans=concat(ans, ' Five');
                    when dig1=6 then set ans=concat(ans, ' Six');
                    when dig1=7 then set ans=concat(ans, ' Seven');
                    when dig1=8 then set ans=concat(ans, ' Eight');
                    when dig1=9 then set ans=concat(ans, ' Nine');
                    else set ans=ans;
                end case;
            end if;
        end if;
    
        return trim(ans);
        END
    

    I tested it like that: select number_to_string(999999999)

    and results: 'Nine Hundred And Ninety Nine Million And Nine Hundred And Ninety Nine Thousand And Nine Hundred And Ninety Nine'

    0 讨论(0)
  • 2020-12-09 13:19

    You need to use a CASE statement:

    SELECT intfield CASE WHEN 1 THEN 'First'
                         WHEN 2 THEN 'Second'
                         WHEN 3 THEN 'Third'
                         ...other conversions...
                         ELSE '' END
    FROM Mytable
    

    EDIT:

    Working code for 3 character numbers below. You can add the needed code below it for 2 and 1 character numbers (basically just modify what I wrote and change the SUBSTRINGs accordingly).

    Essentially it converts the number to a string, checks how many numbers there are, then breaks it down accordingly.

    DECLARE @n int = 515
    
    DECLARE @v varchar(100) = CAST(@N as varchar)
    
    SELECT CASE WHEN LEN(@v) = 3 THEN 
        (CASE   WHEN LEFT(@v, 1) = 1 THEN 'One Hundred'
                WHEN LEFT(@v, 1) = 2 THEN 'Two Hundred'
                WHEN LEFT(@v, 1) = 3 THEN 'Three Hundred'
                WHEN LEFT(@v, 1) = 4 THEN 'Four Hundred'
                WHEN LEFT(@v, 1) = 5 THEN 'Five Hundred'
                WHEN LEFT(@v, 1) = 6 THEN 'Six Hundred'
                WHEN LEFT(@v, 1) = 7 THEN 'Seven Hundred'
                WHEN LEFT(@v, 1) = 8 THEN 'Eight Hundred'
                WHEN LEFT(@v, 1) = 9 THEN 'Nine Hundred'
                ELSE '' END)
        + ' ' +
        (CASE   WHEN SUBSTRING(@v, 2, 1) = 2 THEN 'Twenty'
                WHEN SUBSTRING(@v, 2, 1) = 3 THEN 'Thirty'
                WHEN SUBSTRING(@v, 2, 1) = 4 THEN 'Forty'
                WHEN SUBSTRING(@v, 2, 1) = 5 THEN 'Fifty'
                WHEN SUBSTRING(@v, 2, 1) = 6 THEN 'Sixty'
                WHEN SUBSTRING(@v, 2, 1) = 7 THEN 'Seventy'
                WHEN SUBSTRING(@v, 2, 1) = 8 THEN 'Eighty'
                WHEN SUBSTRING(@v, 2, 1) = 9 THEN 'Ninety'
                WHEN SUBSTRING(@v, 2, 1) = 1 THEN 
                    CASE    WHEN SUBSTRING(@v, 2, 2) = 10 THEN 'Ten'
                            WHEN SUBSTRING(@v, 2, 2) = 11 THEN 'Eleven'
                            WHEN SUBSTRING(@v, 2, 2) = 12 THEN 'Twelve'
                            WHEN SUBSTRING(@v, 2, 2) = 13 THEN 'Thirteen'
                            WHEN SUBSTRING(@v, 2, 2) = 14 THEN 'Fourteen'
                            WHEN SUBSTRING(@v, 2, 2) = 15 THEN 'Fifteen'
                            WHEN SUBSTRING(@v, 2, 2) = 16 THEN 'Sixteen'
                            WHEN SUBSTRING(@v, 2, 2) = 17 THEN 'Seventeen'
                            WHEN SUBSTRING(@v, 2, 2) = 18 THEN 'Eighteen'
                            WHEN SUBSTRING(@v, 2, 2) = 19 THEN 'Nineteen'
                            ELSE '' END
    
    
    
    
                ELSE '' END)
        + ' ' +
        (CASE   WHEN SUBSTRING(@v, 2, 1) = 1 THEN ''
                WHEN SUBSTRING(@v, 3, 1) = 2 THEN 'Two'
                WHEN SUBSTRING(@v, 3, 1) = 3 THEN 'Three'
                WHEN SUBSTRING(@v, 3, 1) = 4 THEN 'Four'
                WHEN SUBSTRING(@v, 3, 1) = 5 THEN 'Five'
                WHEN SUBSTRING(@v, 3, 1) = 6 THEN 'Six'
                WHEN SUBSTRING(@v, 3, 1) = 7 THEN 'Seven'
                WHEN SUBSTRING(@v, 3, 1) = 8 THEN 'Eight'
                WHEN SUBSTRING(@v, 3, 1) = 9 THEN 'Nine'
                WHEN SUBSTRING(@v, 3, 1) = 1 THEN 'One'
                ELSE '' END)
        END
    
    0 讨论(0)
提交回复
热议问题