sql >> データベース >  >> RDS >> Oracle

数字を単語に変換する方法-ORACLE

    力ルークを使用してください;)

    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の出力はTENPOINTTHREEですが、10.3の場合はTEN POINT 30、10.03の場合はTENPOINTTHREEである必要があります。どうすればこれを達成できますか?

    IDに必要な桁数に応じて、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<>フィドルデモ

    出力:

    +-------------+------------------------+
    |  OLD_VALUE  |       NEW_VALUE        |
    +-------------+------------------------+
    |      10.03  | TEN POINT THREE        |
    |       10.3  | TEN POINT THIRTY       |
    |      10.33  | TEN POINT THIRTY-THREE |
    +-------------+------------------------+
    


    1. 自己参照テーブルに対するSQL再帰クエリ(Oracle)

    2. Oracleで一括収集して即時実行

    3. データベースにExcelを使用していますか?アクセスにアップグレードする必要がある理由は次のとおりです

    4. Oracle:関数ベースのインデックス選択的一意性