在Oracle中,如何将诸如1之类的数字转换为诸如“1st”之类的字符串?

时间:2011-07-08 22:19:41

标签: sql oracle string-formatting

我想将数字格式化为“1st”,“2nd”,“4th”,“9th”等。是否有Oracle函数可以为我执行此操作?

3 个答案:

答案 0 :(得分:8)

假设提供的值是数字而不是DATE,您可以使用TO_CHAR但是必须将数值转换为字符串,然后在最终格式化之前将DATE(Julian)转换为:

SELECT TO_CHAR(TO_DATE('1', 'dd'), 'ddth')
  FROM DUAL

结果:

01st

测试时,使用'd'表示格式不会返回预期结果,因为该值被解释为Julian日期。要么输出子字符串以删除前导零,要么提供完整的日期字符串(与TO_CHAR无关,因为它只对月中的某一天感兴趣):

SELECT TO_CHAR(TO_DATE('1900-01-01', 'YYYY-MM-dd'), 'dth')
  FROM DUAL

由于日历日期结束于31,因此请使用年份值来处理大于31的数字:

SELECT TO_CHAR(TO_DATE('32-01-01', 'YYYY-MM-dd'), 'yyth')
  FROM DUAL

结果:

32nd

答案 1 :(得分:2)

也许我过于简单了,但似乎以下内容应该可以正常工作(对于整数)并且比转换为日期和返回更具可读性:

select case 
       when initial_extent is null then null
       when substr(initial_extent,-2,1) = '1' 
            then initial_extent || 'th'
       else case substr(initial_extent,-1,1)
            when '1' then initial_extent || 'st'
            when '2' then initial_extent || 'nd'
            when '3' then initial_extent || 'rd'
            else initial_extent || 'th'
            end
       end as formatted_number
from user_tables

答案 2 :(得分:-1)

select  substr( to_char( to_date( abs( decode( mod( l_value, 10 ), 0, 4, mod( l_value , 10 )  ) ), 'YYYY' ), 'YTH' ), 2 ) as value
from    dual

用适当的hmmm值替换l_value。应该涵盖任何数字。