目录
1、数字函数
3、日期时间函数
附录:关于Decode函数
首页 数据库 mysql教程 Oracle经常用到的一些函数

Oracle经常用到的一些函数

Jun 07, 2016 pm 03:21 PM
nvl oracle s 函数 数字

1、数字函数 NVL( string1, replace_with) :如果string1为NULL,则NVL函数返回replace_with的,否则返回string1的,如果两个参数都为NULL ,则返回NULL。示例如下: SQL select NVL(NULL,1) from dual; NVL(NULL,1)----------- 1 SQL select NVL(12,1) from

1、数字函数

NVL( string1, replace_with) :如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。示例如下:

SQL> select NVL(NULL,1)  from dual;
 
NVL(NULL,1)
-----------
          1
 
SQL> select NVL(12,1) from dual;
 
 NVL(12,1)
----------
        12
 
SQL> select NVL('',1) from dual;           -----单引号里没有空格
 
NVL('',1)
---------
1
登录后复制

NVL的扩展- NVL2(E1, E2, E3)

             Oracle在NVL函数的功能上扩展,提供了NVL2函数。  NVL2(E1, E2, E3)的功能为:如果E1为NULL,则函数返回E3,否则返回E2。示例如下: 

SQL> select nvl2(NULL,12,3) from dual;
 
NVL2(NULL,12,3)
---------------
              3
 
SQL> select nvl2(5,12,3) from dual;
 
NVL2(5,12,3)
------------
          12
登录后复制

SIGN(n) :该函数用于检测数字的正负.如果数字n小于0,则函数的返回值位-1;如果数字n的值等于0,则函数的返回值等于0,如果数字n大于0,则函数的返回值等于1.

SQL> select SIGN(-10),SIGN(0),SIGN(5) from dual;
 
 SIGN(-10)    SIGN(0)    SIGN(5)
---------- ---------- ----------
        -1          0          1
登录后复制

 CEIL(n) :该函数用于返回大于等于数字n的最小整数.    

SQL> select  ceil(15),ceil(15.1) from dual;
 
  CEIL(15) CEIL(15.1)
---------- ----------
        15         16
 
登录后复制

FLOOR(n):该函数用于返回小于等于数字n的最大整数。

SQL>  select floor(15),floor(15.1) from dual;
 
 FLOOR(15) FLOOR(15.1)
---------- -----------
        15          15
登录后复制

MOD(m,n) :该函数用于返回两个数字相除后的余数.如果数字n为0,则返回结果为m

SQL> select  mod(10,3) from dual;
 
 MOD(10,3)
----------
         1
SQL> select  mod(10,0) from dual;
 
 MOD(10,0)
----------
        10 
登录后复制

ROUND(n,[m]) :该函数用于执行四舍五入运算;如果省略m,则四舍五入至整数位;如果m是负数,则四舍五入到小数点前m位;如果m是整数,则四舍五入至小数点后m位.示例如下:

SQL> select round(65.698) from dual;
 
ROUND(65.698)
-------------
           66
 
SQL> select round(65.698,1) from dual;
 
ROUND(65.698,1)
---------------
           65.7
 
SQL> select round(65.698,-1) from dual;
 
ROUND(65.698,-1)
----------------
              70
登录后复制

 TRUNC(n,[m]) :该函数用于截取数字。如果省略数字m,则将数字n的小数部分截去;如果数字m是正数,则将数字n截取到小数点后的第m位;如果数字m是负数,则将数字n截取到小数点前m位.示例如下:

SQL> select trunc(65.698) from dual;
 
TRUNC(65.698)
-------------
           65
 
SQL> select trunc(65.698,2) from dual;
 
TRUNC(65.698,2)
---------------
          65.69
 
SQL> select trunc(65.698,1) from dual;
 
TRUNC(65.698,1)
---------------
           65.6
 
SQL> select trunc(65.698,-1) from dual;
 
TRUNC(65.698,-1)
----------------
              60
 
SQL> select trunc(65.698,-2) from dual;
 
TRUNC(65.698,-2)
----------------
               0
登录后复制


2、字符函数

字符函数的输入参数为字符类型,其返回值位字符类型或数字类型。字符函数既可以在SQL语句中使用,也可以在PL/SQL块中使用.

 

TRIM 函数的语法如下:

TRIM([ { { LEADING | TRAILING | BOTH }
      [ trim_character ]
   | trim_character
   }
   FROM
    ]
    trim_source
)
登录后复制

下面的这种情况是用于截取特定的字符串

DECLARE 
     v_source  VARCHAR2(20) :='ABCDGHJHAB';
     v_trim    VARCHAR2(20);
BEGIN
	  v_trim:=trim('A' FROM v_source);
	  dbms_output.put_line(v_trim);
END;	 
登录后复制

下面的情况是去除字符串的行首和行尾的空格 ,为了便于理解,用length函数打印trim截取字符串后的长度:

SQL> select length(trim('   hello  ')) from dual;               ----什么都不写,默认情况下截取两端的空格
 
LENGTH(TRIM('HELLO'))
---------------------
                    5

SQL> select length(trim(leading from ' hello')) from dual;      ------leading 截取字符串前面空格
 
LENGTH(TRIM(LEADINGFROM'HELLO'
------------------------------
                             5 
SQL> select length(trim(trailing from ' hello ')) from dual;    ---trailing  截取字符串后面空格 
 
LENGTH(TRIM(TRAILINGFROM'HELLO
------------------------------
                             6
SQL> select length(trim(both from ' hello ')) from dual;         -----both 截取两端的空格
 
LENGTH(TRIM(BOTHFROM'HELLO'))
-----------------------------
                            5
登录后复制

 

ASCII(char):该函数用于返回字符串首字符的ASCII值,示例如下:

SQL> select ascii('a') "a" ,ascii('A') "A"  from dual;
 
         a          A
---------- ----------
        97         65
 
登录后复制

CHR(char) :该函数用于将ASCII码值转变为字符。示例如下:

SQL> select chr('97') from dual;
 
CHR('97')
---------
a
 
SQL> select chr('56') from dual;
 
CHR('56')
---------
8
登录后复制

CONCAT:该函数用于连接字符串,其作用于连接操作符(||)完全相同。示例如下:

SQL> select concat('Good','Morning') from dual;
 
CONCAT('GOOD','MORNING')
------------------------
GoodMorning
SQL> select 'Good'|| 'Morning' from dual;
 
'GOOD'||'MORNING'
-----------------
GoodMorning

登录后复制

 LENGTH(char):该函数用于返回字符串的长度,如果字符串的类型为CHAR,则其长度包括所有的后缀空格:如果char是null,则返回null。示例如下:

SQL> select length('111') from dual;
 
LENGTH('111')
-------------
            3
 
登录后复制

 

3、日期时间函数

日期时间函数用于处理DATE和TIMESTAMP类型的数据。 除了函数,MONTHS_BETWEEN返回数字值外,其它日志函数均返回DATE类型的数据.Oracle是以7位数字格式来存放日期数据的,包括世纪、年、月、日小时、分钟、秒,并且默认时间显示格式为"DD-MON-YY"。下面详细介绍Oracle所提供的日期时间函数,以及在SQL语句和PL/SQL块中使用这些函数的方法。

ADD_MONTHS(d,n):该函数用于返回特定日期时间 d 之后(或之前)的n个月所对应的日期时间(n为正整数表示之后,n为负整数表示之前).示例如下:

SQL> set serveroutput on;
SQL> 
SQL> DECLARE
  2       v_date DATE;
  3  BEGIN
  4        v_date:=add_months(sysdate,-12);
  5        dbms_output.put_line('当前日期前14个月所对应的日期:'||v_date);
  6  END;
  7  
  8  /
 
当前日期前14个月所对应的日期:05-7月 -12
 
PL/SQL procedure successfully completed
 
登录后复制

TRUNC(d,[fmt]) :该函数用于截取日期时间数据.如果fmt指定年度,则结果为本年度的1月1日;如果fmt指定月,则结果为本月1日。示例如下:

----------月
SQL> select trunc(sysdate,'MONTH') from dual;
 
TRUNC(SYSDATE,'MONTH')
----------------------
2013/7/1
 
SQL> select trunc(sysdate,'mm') from dual;
 
TRUNC(SYSDATE,'MM')
-------------------
2013/7/1

----------年
SQL> select trunc(sysdate,'YY') from dual;
 
TRUNC(SYSDATE,'YY')
-------------------
2013/1/1
 
SQL> select trunc(sysdate,'YEAR') from dual;
 
TRUNC(SYSDATE,'YEAR')
---------------------
2013/1/1
登录后复制


MOTNS_BETWEEN(d1,d2):该函数用于返回d1和d2之间相差的月数.如果d1小于d2,则返回负数;如果d1和d2的天数相同,或都是月底,则返回整数;否则Oracle以每月31天为准来计算结果的小数部分。示例如下:

SQL> select months_between(sysdate,'6-7月-1998') from dual;
 
 MONTHS_BETWEEN(SYSDATE,'6-7月-
------------------------------
                           180
登录后复制


NEXT_DAY(d,char):该函数用于返回指定日期后的第一个工作日(由char指定)所对应的日期。示例如下:

SQL> select next_day(sysdate,'星期日') from dual;
 
NEXT_DAY(SYSDATE,'星期日')
--------------------------
2013/7/7 9:15:51

SQL> select next_day(sysdate,'星期一') from dual;
 
NEXT_DAY(SYSDATE,'星期天')
--------------------------
2013/7/8 9:15:11
登录后复制


4、转换函数

 转换函数用于将数值从一种数值类型转换为另一种数据类型。在某些情况下,Oracle Server会隐含地转换数据类型。但在编写应用程序时,为了防止出现编译错误,如果数据类型不同,那么应该使用转换函数进行类型转换.下面详细介绍Oracle所提供的转换函数,以及在SQL语句和PL/SQL块中使用这些转换函数的方法。

TO_CHAR(data[,fmt[,nls_param]]) :该函数用于将日期值转变为字符串,其中fmt用于指定日期格式,nls_param用于指定nls参数。示例如下:

SQL> select to_char(sysdate,'YYYY-MM-DD') from dual;
 
TO_CHAR(SYSDATE,'YYYY-MM-DD')
-----------------------------
2013-07-06
登录后复制

TO_CHAR(n[,fmt[,nls_param]]):用于将数字值转换为VARCHAR2数据类型.示例如下:

SQL> select to_char(100) from dual;
 
TO_CHAR(100)
------------
100
登录后复制


TO_DATE(char[,fmt[,nls_param]]):该函数用于将符合指定日期的函数转变为DATE类型的数值,示例如下:

SQL> select TO_DATE('01-01-2001','DD-MM-YYYY') from dual;
 
TO_DATE('01-01-2001','DD-MM-YY
------------------------------
2001/1/1
 
SQL> select TO_DATE('2001-01-01','YYYY-MM-DD') from dual;
 
TO_DATE('2001-01-01','YYYY-MM-
------------------------------
2001/1/1
登录后复制



 

附录:关于Decode函数

             DECODE是Oracle公司独家提供的功能,它是一个功能很强的函数。它虽然不是SQL的标准,但对于性能非常有用。到目前,其他的数据库供应商还不能提供类似DECODE的功能,甚至有的数据库的供应商批评Oracle的SQL不标准。实际上,这种批评有些片面或不够水平。就象有些马车制造商抱怨亨利。福特的“马车”不标准一样。

 

1、DECODE 中的if-then-else逻辑

在逻辑编程中,经常用到If – Then –Else 进行逻辑判断。在DECODE的语法中,实际上就是这样的逻辑处理过程。它的语法如下:

DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )

Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。事实上,可以给出多个if/then 配对。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。

需要注意的是,这里的if、then及else 都可以是函数或计算表达式。

 

2 DECODE 的简单例子

Oracle系统中就有许多数据字典是使用decode 思想设计的,比如记录会话信息的V$SESSION数据字典视图就是这样。我们从《Oracle8i/9i Reference》资料中了解到,当用户登录成功后在V$SESSION中就有该用户的相应记录,但用户所进行的命令操作在该视图中只记录命令的代码(0—没有任何操作,2—Insert…),而不是具体的命令关键字。因此,我们需要了解当前各个用户的名字及他们所进行的操作时,要用下面命令才能得到详细的结果:

select sid,serial#,username,
DECODE(command,
0,’None’,
2,’Insert’,
3,’Select’,
6,’Update’,
7,’Delete’,
8,’Drop’,
‘Other’) cmmand
from v$session where username is not null;
登录后复制

3 DECODE实现表的转置

数据库中的表是由列和行构成的一个二维表。一般列在任何数据库中都是有限的数量,而行的变化较大,如果表很大,行的数量可能大上千万行。同一列的不同行可能有不同的值,而且不是预先定义的。

例:住房公积金报表置换实例:

1.各个单位在本地经办行进行开户,开户就是将单位的基本信息和职工信息的进行登记;

2.每月各个单位的会计到经办行交缴本单位的所有职工的住房公积金,系统记录有每个职工的交缴明细并在每条记录上记录有经办行的代码;

3.每月、季、半年及年终都要求将经办行 变为“列”给出个月的明细报表:

经办行:城西区城东区

月份:

2001.01 xxxx1.xx xxxxx2.xx

2001.02 xxxx3.xx xxxxx4.xx

。 。 。 。 。 。

原来的数据顺序是:

城西区2001.01 xxxxx1.xx

城东区2001.01 xxxxx2.xx

城西区2001.02 xxxxx3.xx

城东区2001.02 xxxxx4.xx

住房公积金系统记录职工的每月交缴名细的pay_lst表结构是:

bank_code varchar2(6)NOT NULL, -- 经办行代码

acc_no varchar2(15) not null, -- 单位代码(单位帐号)

emp_acc_no varchar2(20) not null, -- 职工帐号

tran_date date not null, -- 交缴日期

tran_val Number(7,2) not null, -- 交缴额

sys_date date default sysdate, --系统日期

oper_id varchar2(10) --操作员代码

这样的表结构,一般按照将经办行作为行(row)进行统计是很容易的,但是如果希望将经办行变为列(column)这样的格式来输出就有困难。如果用DECODE函数来处理则变得很简单:

我们创建一个视图来对目前的pay_lst表进行查询。将经办行代码变为一些具体的经办行名称即可:

CREATE OR REPLACE VIEW bank_date_lst AS

Select to_char(tran_date,’yyyy .mm’),

SUM( DECODE ( bank_code,’001’, tran_val,0 )) 城西区,

SUM( DECODE ( bank_code,’002’, tran_val,0 )) 城南区,

SUM( DECODE ( bank_code,’003’, tran_val,0 )) 城东区

FROM pay_lst

GROUP BY to_char(tran_date,’yyyy .mm’);

建立视图后,可直接对该视图进行查询就可按照列显示出结果。

简单应用:

如果字段a值为null,则替换为0

decode(a,Null,0,a) a字段如果为null,则替换为0,如果不为null,则为a[1]

 

 

 

 

 

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

oracle如何使用存储过程 oracle如何使用存储过程 Apr 11, 2025 pm 07:03 PM

存储过程是一组可存储在数据库中的 SQL 语句,可作为独立单元重复调用。它们可以接受参数(IN、OUT、INOUT),并提供代码重用、安全性、性能和模块化的优势。示例:创建存储过程 calculate_sum 来计算两个数字的总和并将其存储在 OUT 参数中。

oracle如何配置环境变量 oracle如何配置环境变量 Apr 11, 2025 pm 07:18 PM

Oracle 环境变量配置指南:创建 ORACLE_HOME 环境变量,指向 Oracle 主目录。将 Oracle 二进制文件目录添加到 PATH 环境变量。设置 TNS_ADMIN 环境变量(如果使用 TNS 命名文件)。验证环境变量设置,确保输出显示已设置的变量。

oracle如何增加表字段 oracle如何增加表字段 Apr 11, 2025 pm 07:30 PM

使用 ALTER TABLE 语句,具体语法如下:ALTER TABLE table_name ADD column_name data_type [constraint-clause]。其中:table_name 为表名,column_name 为字段名,data_type 为数据类型,constraint-clause 为可选的约束。示例:ALTER TABLE employees ADD email VARCHAR2(100) 为 employees 表添加 email 字段。

oracle如何去重查询 oracle如何去重查询 Apr 11, 2025 pm 07:33 PM

Oracle 提供多种去重查询方法:DISTINCT 关键字返回每列的唯一值。GROUP BY 子句对结果分组并返回每个分组的非重复值。UNIQUE 关键字用于创建仅包含唯一行的索引,查询该索引将自动去重。ROW_NUMBER() 函数分配唯一数字并过滤出仅包含第 1 行的结果。MIN() 或 MAX() 函数可返回数字列的非重复值。INTERSECT 运算符返回两个结果集的公共值(无重复项)。

oracle数据库如何导入 oracle数据库如何导入 Apr 11, 2025 pm 08:06 PM

数据导入方法:1. 使用 SQLLoader 实用程序:准备数据文件、创建控制文件、运行 SQLLoader;2. 使用 IMP/EXP 工具:导出数据、导入数据。提示:1. 大数据集推荐 SQL*Loader;2. 目标表应存在,列定义匹配;3. 导入后需验证数据完整性。

oracle中乱码怎么解决 oracle中乱码怎么解决 Apr 11, 2025 pm 10:09 PM

Oracle 乱码问题可以通过以下步骤解决:检查数据库字符集以确保与数据相匹配。设置客户端字符集以与数据库相匹配。转换数据或修改列字符集以匹配数据库字符集。使用 Unicode 字符集,并避免多字节字符集。检查数据库和客户端的语言设置是否正确。

oracle如何查表空间大小 oracle如何查表空间大小 Apr 11, 2025 pm 08:15 PM

要查询 Oracle 表空间大小,请遵循以下步骤:确定表空间名称,方法是运行查询:SELECT tablespace_name FROM dba_tablespaces;查询表空间大小,方法是运行查询:SELECT sum(bytes) AS total_size, sum(bytes_free) AS available_space, sum(bytes) - sum(bytes_free) AS used_space FROM dba_data_files WHERE tablespace_

oracle如何创建主键约束 oracle如何创建主键约束 Apr 11, 2025 pm 07:15 PM

主键是唯一标识表中每一行的特殊列或列组合,它确保表中的记录都是独一无二的,可以通过以下步骤创建:使用 ALTER TABLE 语句指定表名。添加 PRIMARY KEY 关键字后跟要指定为主键的列名。主键约束有助于确保数据唯一性、提高查询速度、防止重复记录并简化表连接。

See all articles