You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Oracle SQL中将数字金额转换为英文单词?需实现批量转换函数

Oracle SQL 数字金额转英文表述实现方案

1. 单数字转换示例(以156为例)

使用自定义函数直接调用即可完成转换:

SELECT NUM_TO_ENGLISH(156) AS amount_in_english FROM DUAL;

执行结果:one hundred and fifty six

2. 批量转换用自定义函数

以下是适配Oracle SQL环境的PL/SQL函数,可接收数字参数并自动完成转换,支持批量处理需求:

CREATE OR REPLACE FUNCTION NUM_TO_ENGLISH(p_num IN NUMBER) RETURN VARCHAR2 IS
    v_num NUMBER := ABS(p_num);
    v_str VARCHAR2(1000) := '';
    
    TYPE num_words IS TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER;
    v_units num_words;
    v_tens num_words;
    v_teens num_words;
    
    FUNCTION convert_three_digits(p_three_num IN NUMBER) RETURN VARCHAR2 IS
        v_hundreds NUMBER := TRUNC(p_three_num / 100);
        v_rest NUMBER := MOD(p_three_num, 100);
        v_result VARCHAR2(200) := '';
        v_tens_part NUMBER;
        v_units_part NUMBER;
    BEGIN
        IF v_hundreds > 0 THEN
            v_result := v_units(v_hundreds) || ' hundred';
            IF v_rest > 0 THEN
                v_result := v_result || ' and ';
            END IF;
        END IF;
        
        IF v_rest BETWEEN 11 AND 19 THEN
            v_result := v_result || v_teens(v_rest);
        ELSE
            v_tens_part := TRUNC(v_rest / 10);
            v_units_part := MOD(v_rest, 10);
            
            IF v_tens_part > 0 THEN
                v_result := v_result || v_tens(v_tens_part);
                IF v_units_part > 0 THEN
                    v_result := v_result || ' ';
                END IF;
            END IF;
            
            IF v_units_part > 0 THEN
                v_result := v_result || v_units(v_units_part);
            END IF;
        END IF;
        
        RETURN TRIM(v_result);
    END convert_three_digits;
BEGIN
    -- 初始化数字对应英文单词数组
    v_units(1) := 'one';
    v_units(2) := 'two';
    v_units(3) := 'three';
    v_units(4) := 'four';
    v_units(5) := 'five';
    v_units(6) := 'six';
    v_units(7) := 'seven';
    v_units(8) := 'eight';
    v_units(9) := 'nine';
    
    v_tens(2) := 'twenty';
    v_tens(3) := 'thirty';
    v_tens(4) := 'forty';
    v_tens(5) := 'fifty';
    v_tens(6) := 'sixty';
    v_tens(7) := 'seventy';
    v_tens(8) := 'eighty';
    v_tens(9) := 'ninety';
    
    v_teens(11) := 'eleven';
    v_teens(12) := 'twelve';
    v_teens(13) := 'thirteen';
    v_teens(14) := 'fourteen';
    v_teens(15) := 'fifteen';
    v_teens(16) := 'sixteen';
    v_teens(17) := 'seventeen';
    v_teens(18) := 'eighteen';
    v_teens(19) := 'nineteen';
    
    -- 处理零的情况
    IF v_num = 0 THEN
        RETURN 'zero';
    END IF;
    
    -- 处理负数
    IF p_num < 0 THEN
        v_str := 'negative ';
    END IF;
    
    -- 处理百万级(可根据需求扩展更大单位)
    IF v_num >= 1000000 THEN
        v_str := v_str || convert_three_digits(TRUNC(v_num / 1000000)) || ' million';
        v_num := MOD(v_num, 1000000);
        IF v_num > 0 THEN
            v_str := v_str || ' ';
        END IF;
    END IF;
    
    -- 处理千级
    IF v_num >= 1000 THEN
        v_str := v_str || convert_three_digits(TRUNC(v_num / 1000)) || ' thousand';
        v_num := MOD(v_num, 1000);
        IF v_num > 0 THEN
            v_str := v_str || ' ';
        END IF;
    END IF;
    
    -- 处理剩余三位数
    IF v_num > 0 THEN
        v_str := v_str || convert_three_digits(v_num);
    END IF;
    
    RETURN TRIM(v_str);
EXCEPTION
    WHEN OTHERS THEN
        RETURN 'Invalid number';
END NUM_TO_ENGLISH;
/

函数使用说明

  • 参数:p_num 为需要转换的数字(支持正负整数)
  • 返回值:对应的英文表述字符串
  • 批量处理示例:若要转换表中某列的所有数字,可直接在查询中调用:
SELECT amount, NUM_TO_ENGLISH(amount) AS amount_english FROM payment_table;

注意事项

  • 函数默认支持整数转换,若需处理小数金额,可扩展函数逻辑拆分整数和小数部分分别转换
  • 可根据业务需求扩展更大的数字单位(如十亿 billion)

内容的提问来源于stack exchange,提问作者idk_1808

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:33:23