I have written a very simple query which result a value 500, i need to convert this value like following:-
old value = 500
new value = FIVE HUNDERED/=
DELIMITER $$ CREATE FUNCTION `number_to_string`(n INT) RETURNS varchar(100) BEGIN -- This function returns the string representation of a number.
Purpose. TO_CHAR (number) converts n to a value of VARCHAR2 datatype, using the optional number format fmt . The value n can be of type NUMBER , BINARY_FLOAT , or BINARY_DOUBLE . If you omit fmt , then n is converted to a VARCHAR2 value exactly long enough to hold its significant digits.
Oracle Database supports JavaScript Object Notation (JSON) data natively with relational database features, including transactions, indexing, declarative querying, and views. This documentation covers the use of database languages and features to work with JSON data that is stored in Oracle Database.
Use the force Luke ;)
SqlFiddleDemo
SELECT UPPER(TO_CHAR(TO_DATE(500,'J'),'Jsp')) || '/=' AS new_value
FROM dual;
The clue is Date
in spelled format.
EDIT:
Adding support for 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
Adding limited support for 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
EDIT 3:
for 10.3 output is TEN POINT THREE but it should be TEN POINT THIRTY for 10.3 and TEN POINT THREE for 10.03. How could I achieve this?
Depending of how many digits you want for identity it could be RPADed
with 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 demo
Output:
+-------------+------------------------+
| OLD_VALUE | NEW_VALUE |
+-------------+------------------------+
| 10.03 | TEN POINT THREE |
| 10.3 | TEN POINT THIRTY |
| 10.33 | TEN POINT THIRTY-THREE |
+-------------+------------------------+
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With