Използвайте силата Люк;)
SqlFiddleDemo
SELECT UPPER(TO_CHAR(TO_DATE(500,'J'),'Jsp')) || '/=' AS new_value
FROM dual;
Уликата е Date
в правописен формат.
РЕДАКТИРАНЕ:
Добавяне на поддръжка за negative numbers
:
SqlFiddleDemo
WITH cte AS
(
SELECT 10 AS num FROM dual
UNION ALL SELECT -500 FROM dual
UNION ALL SELECT 0 FROM dual
)
SELECT num AS old_value,
decode( sign( num ), -1, 'NEGATIVE ', 0, 'ZERO', NULL ) ||
decode( sign( abs(num) ), +1, to_char( to_date( abs(num),'J'),'JSP') ) || '/=' AS new_value
FROM cte
РЕДАКТИРАНЕ 2:##
Добавяне на ограничена поддръжка за float:
SqlFiddleDemo3
WITH cte AS
(
SELECT 10 AS num FROM dual
UNION ALL SELECT -500 FROM dual
UNION ALL SELECT 0 FROM dual
UNION ALL SELECT 10.3 FROM dual
UNION ALL SELECT -10.7 FROM dual
)
SELECT
num AS old_value,
decode( sign( num ), -1, 'NEGATIVE ', 0, 'ZERO', NULL )
|| decode( sign( abs(num) ), +1, to_char( to_date( abs(TRUNC(num)),'J'),'JSP') )
||
CASE
WHEN INSTR (num, '.') > 0
THEN ' POINT ' || TO_CHAR (TO_DATE (TO_NUMBER (SUBSTR(num, INSTR (num, '.') + 1)),'J'),'JSP')
ELSE NULL
END AS new_value
FROM cte
РЕДАКТИРАНЕ 3:
за 10.3 изходът е ДЕСЕТ ТОЧКА ТРИ, но трябва да бъде ДЕСЕТ ТОЧКА ТРИдесет за 10.3 и ДЕСЕТ ТОЧКА ТРИ за 10.03. Как мога да постигна това?
В зависимост от това колко цифри искате за идентичност, тя може да бъде RPADed
с 0:
WITH cte AS
(
SELECT 10.03 AS num FROM dual
UNION ALL
SELECT 10.30 FROM dual
UNION ALL
SELECT 10.33 FROM dual
)
SELECT
num AS old_value,
decode( sign( num ), -1, 'NEGATIVE ', 0, 'ZERO', NULL )
|| decode( sign( abs(num) ), +1, to_char( to_date( abs(TRUNC(num)),'J'),'JSP') )
||
CASE
WHEN INSTR (num, '.') > 0
THEN ' POINT ' || TO_CHAR (TO_DATE (TO_NUMBER (RPAD(SUBSTR(num, INSTR (num, '.') + 1)
,2,'0')
),'J'),'JSP')
ELSE NULL
END AS new_value
FROM cte;
db<>демонстрация на fiddle
Изход:
+-------------+------------------------+
| OLD_VALUE | NEW_VALUE |
+-------------+------------------------+
| 10.03 | TEN POINT THREE |
| 10.3 | TEN POINT THIRTY |
| 10.33 | TEN POINT THIRTY-THREE |
+-------------+------------------------+