插件窝 干货文章 oracle函数用法

oracle函数用法

SELECT salary 函数 sql 145    来源:    2025-04-23

Oracle 函数用法详解

Oracle 数据库提供了丰富的内置函数,可以用于数据查询、转换、计算和聚合等操作。以下是 Oracle 函数的分类和主要用法:

一、单行函数

1. 字符函数

  • UPPER/LOWER/INITCAP: 转换大小写

    SELECT UPPER('hello'), LOWER('WORLD'), INITCAP('oracle database') FROM dual;
    
  • CONCAT/||: 字符串连接

    SELECT CONCAT('Hello', 'World'), 'Hello' || ' ' || 'World' FROM dual;
    
  • SUBSTR: 截取子串

    SELECT SUBSTR('Oracle Database', 8, 8) FROM dual; -- 返回 'Database'
    
  • LENGTH/LENGTHB: 字符串长度

    SELECT LENGTH('Oracle'), LENGTHB('甲骨文') FROM dual;
    
  • INSTR: 查找子串位置

    SELECT INSTR('Oracle Database', 'ase') FROM dual; -- 返回 13
    
  • LPAD/RPAD: 填充字符串

    SELECT LPAD('500', 6, '0'), RPAD('500', 6, '*') FROM dual;
    
  • TRIM/LTRIM/RTRIM: 去除空格或指定字符

    SELECT TRIM('  Oracle  '), LTRIM('xxxOracle', 'x') FROM dual;
    
  • REPLACE: 替换字符串

    SELECT REPLACE('Oracle Database', 'Database', 'DB') FROM dual;
    

2. 数值函数

  • ROUND: 四舍五入

    SELECT ROUND(45.926, 2), ROUND(45.926, -1) FROM dual;
    
  • TRUNC: 截断数字

    SELECT TRUNC(45.926, 2), TRUNC(45.926, -1) FROM dual;
    
  • MOD: 取模

    SELECT MOD(10, 3) FROM dual; -- 返回 1
    
  • CEIL/FLOOR: 向上/向下取整

    SELECT CEIL(3.14), FLOOR(3.14) FROM dual;
    

3. 日期函数

  • SYSDATE: 当前系统日期和时间

    SELECT SYSDATE FROM dual;
    
  • ADD_MONTHS: 增加月份

    SELECT ADD_MONTHS(SYSDATE, 3) FROM dual;
    
  • MONTHS_BETWEEN: 月份差

    SELECT MONTHS_BETWEEN('01-JAN-2023', '01-MAR-2023') FROM dual;
    
  • LAST_DAY: 月份最后一天

    SELECT LAST_DAY(SYSDATE) FROM dual;
    
  • NEXT_DAY: 下一个指定星期几的日期

    SELECT NEXT_DAY(SYSDATE, 'FRIDAY') FROM dual;
    
  • EXTRACT: 提取日期部分

    SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual;
    

4. 转换函数

  • TO_CHAR: 转换为字符串

    SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
    SELECT TO_CHAR(1234.56, 'L9,999.99') FROM dual; -- 本地货币格式
    
  • TO_NUMBER: 转换为数字

    SELECT TO_NUMBER('$1,234.56', '$9,999.99') FROM dual;
    
  • TO_DATE: 转换为日期

    SELECT TO_DATE('2023-01-15', 'YYYY-MM-DD') FROM dual;
    

5. 通用函数

  • NVL/NVL2: 空值处理

    SELECT NVL(commission_pct, 0), NVL2(commission_pct, '有佣金', '无佣金') FROM employees;
    
  • COALESCE: 返回第一个非空表达式

    SELECT COALESCE(commission_pct, salary, 0) FROM employees;
    
  • DECODE: 简单条件判断

    SELECT DECODE(department_id, 10, '财务部', 20, '研发部', '其他部门') FROM employees;
    
  • CASE: 条件表达式

    SELECT CASE WHEN salary > 10000 THEN '高薪'
              WHEN salary > 5000 THEN '中等'
              ELSE '低薪' END AS salary_level
    FROM employees;
    

二、聚合函数

  • AVG: 平均值

    SELECT AVG(salary) FROM employees;
    
  • COUNT: 计数

    SELECT COUNT(*), COUNT(commission_pct) FROM employees;
    
  • MAX/MIN: 最大/最小值

    SELECT MAX(salary), MIN(hire_date) FROM employees;
    
  • SUM: 求和

    SELECT SUM(salary) FROM employees WHERE department_id = 50;
    
  • LISTAGG: 列转行(字符串聚合)

    SELECT department_id, LISTAGG(last_name, ',') WITHIN GROUP (ORDER BY last_name)
    FROM employees GROUP BY department_id;
    

三、分析函数

  • ROW_NUMBER: 行号

    SELECT employee_id, last_name, salary,
         ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
    FROM employees;
    
  • RANK/DENSE_RANK: 排名

    SELECT employee_id, last_name, salary,
         RANK() OVER (ORDER BY salary DESC) AS rank,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
    FROM employees;
    
  • LEAD/LAG: 访问前后行数据

    SELECT employee_id, last_name, hire_date,
         LAG(hire_date, 1) OVER (ORDER BY hire_date) AS prev_hire_date,
         LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS next_hire_date
    FROM employees;
    
  • FIRST_VALUE/LAST_VALUE: 访问窗口首尾值

    SELECT employee_id, last_name, salary, department_id,
         FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary) AS lowest_sal
    FROM employees;
    

四、高级函数

  • PIVOT/UNPIVOT: 行列转换

    -- 行转列
    SELECT * FROM (
    SELECT department_id, job_id, salary FROM employees
    ) PIVOT (
    AVG(salary) FOR job_id IN ('IT_PROG' AS IT, 'SA_REP' AS Sales)
    );
    
    -- 列转行
    SELECT * FROM pivot_table
    UNPIVOT (
    salary FOR job_id IN (IT AS 'IT_PROG', Sales AS 'SA_REP')
    );
    
  • JSON函数(Oracle 12c及以上)

    SELECT JSON_OBJECT('id' VALUE employee_id, 'name' VALUE last_name) FROM employees;
    SELECT JSON_VALUE('{"id":100, "name":"King"}', '$.name') FROM dual;
    

五、自定义函数

创建自定义函数示例:

CREATE OR REPLACE FUNCTION get_annual_salary(
  p_monthly_sal NUMBER,
  p_commission NUMBER DEFAULT 0
) RETURN NUMBER IS
  v_annual_sal NUMBER;
BEGIN
  v_annual_sal := (p_monthly_sal + NVL(p_commission, 0)) * 12;
  RETURN v_annual_sal;
END get_annual_salary;
/

-- 使用自定义函数
SELECT last_name, salary, get_annual_salary(salary, commission_pct) AS annual_sal
FROM employees;

以上是Oracle函数的主要用法,实际应用中可以根据具体需求选择合适的函数组合使用。