`

ORACLE的sign函数和DECODE函数 decode与case的区别

阅读更多

decode与case的区别
  如果条件都是“=”,用decode方便,如果涉及其它运算符,则cse更方便。
  在使用Oracle10g时发现,decode中的项目不能超过250个。
  如将系统1的地市编码转化为系统2的地市编码,数目可能会超过250个。

·DECODE函数的作用:它可以将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。
·区别于SQL的其它函数,DECODE函数还能识别和操作空值。
  语法如下:
  DECODE(control_value,value1,result1[,value2,result2…][,default_result]);
  control _value 试图处理的数值。DECODE函数将该数值与后面的一系列的偶序相比较,以决定返回值。
  value1 是一组成序偶的数值。如果输入数值与之匹配成功,则相应的结果将被返回。对应一个空的返回值,可以使用关键字NULL于之对应
  result1 是一组成序偶的结果值。
  default_result 未能与任何一个值匹配时,函数返回的默认值。
  示例如下:
  select decode( x , 1 , ‘x is 1 ’, 2 , ‘x is 2 ’, ‘others’) from dual
  当x等于1时,则返回‘x is 1’。
  当x等于2时,则返回‘x is 2’。
  否则,返回others’。
  在需要比较2个值的时候,我们可以配合SIGN()函数一起使用。
  SELECT DECODE( SIGN(5 -6), 1 'Is Positive', -1, 'Is Nagative', 'Is Zero')
  同样,也可以用CASE实现:
  SELECT CASE SIGN(5 - 6)
  WHEN 1 THEN 'Is Positive'
  WHEN -1 THEN 'Is Nagative'
  ELSE 'Is Zero' END
  FROM DUAL

 

 

比较大小函数 sign

函数语法:
sign(n)

函数说明:
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0

示例:
一、select sign( 100 ),sign(- 100 ),sign( 0 ) from dual;

  SIGN(100) SIGN(-100) SIGN(0)
  ———- ———- ———-
  1 -1 0

二、a=10,b=20 
  则sign(a-b)返回-1
 
流程控制函数 DECODE 

函数介绍  

DECODE函数是ORACLE PL/SQL的功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其它数据库厂商的SQL实现还没有此功能。DECODE有什么用途呢?先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的加20%;工资在8000元或以上的加15%,通常的做法是,先选出记录中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else或choose case之类的流控制语句进行判断。如果用DECODE函数,那么我们就可以把这些流控制语句省略,通过SQL语句就可以直接完成。如下:select decode(sign(salary - 8000),>=0,salary*1.15,<0,salary*1.2,salary) from employee 是不是很简洁? DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。

关于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’);
 
  建立视图后,可直接对该视图进行查询就可按照列显示出结果。
分享到:
评论

相关推荐

    Oracle-Decode()函数和CASE语句的比较

    Oracle数据库中的`Decode()`函数和`CASE`语句都是用于条件判断和数据转换的重要工具,它们各有特点,适用场景也有所不同。以下是对这两个功能的详细比较。 首先,`Decode()`函数是一个简化的条件表达式,它允许你在...

    Oracle 中 decode 函数用法

    Oracle中的DECODE函数是一种非常实用的工具,它允许你在SQL查询中执行简单的条件判断和返回相应的值。这个函数类似于IF-THEN-ELSE语句的简写形式,减少了编写复杂逻辑的代码量,使得SQL语句更加简洁易读。 DECODE...

    Oracle高级操作函数学习笔记

    在提供的内容中,通过DECODE函数实现了工资的区间判断显示,使用CASE语句完成了加薪规则的计算,还演示了如何使用UNION、INTERSECT和MINUS进行集合操作。这些知识点展示了Oracle在数据处理方面的灵活性和高效性,...

    Oracle常用函数和使用方法

    #### 二、DECODE函数:条件判断与转换 **功能描述**:`DECODE`函数用于实现多条件判断,类似于编程语言中的`switch-case`语句。其语法如下: ``` DECODE(条件, 值1, 翻译值1, 值2, 翻译值2, ..., 值n, 翻译值n, ...

    decode函数.pdf

    Decode函数是Oracle数据库中用于实现条件逻辑的一个内置函数,它类似于编程语言中的switch-case语句或if-then-else语句。Decode函数可以对给定的表达式进行多个条件判断,并返回匹配条件的相应值。Decode函数广泛...

    decode函数借鉴.pdf

    DECODE 函数是 Oracle 公司独家的功能强大的函数,它提供了简洁的运算方式、可控的数据模型和灵活的格式转换。DECODE 函数是 Oracle PL/SQL 的功能强大的函数之一,目前还只有 Oracle 公司的 SQL 提供了此函数,其他...

    Oracle常用函数

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的内置函数,以支持复杂的查询和数据处理。在Oracle中,函数是执行特定任务的预定义SQL或PL/SQL代码块,它们可以帮助我们处理和转换数据。让我们深入...

    oracle中decode函数的使用方法示例

    DECODE函数在Oracle数据库中非常灵活,可以根据不同的需求进行条件判断和值的转换,极大地简化了SQL查询的复杂性。它可以处理多个条件,同时返回一个明确的结果,是数据库查询中不可或缺的一部分。

    Oracle函数大全.pdf

    此外,Oracle还提供了许多其他类型的函数,例如与环境信息和条件判断相关的函数。 - **dump**: 返回有关列的详细信息。 - **greatest/least**: 返回给定表达式列表中的最大值和最小值。 - **nvl/nvl2**: 在参数为...

    ORACLE函数及其用法

    Oracle是一种广泛使用的数据库管理系统,它提供了丰富的内置函数,这些函数能够帮助开发者和数据库管理员更高效地处理数据。本文将详细介绍Oracle中的一些常用函数及其应用场景。 #### 数值型函数 1. **ABS(X)**:...

    oracle常用函数

    - `DECODE`: 类似于CASE WHEN语句,用于条件判断和返回相应的值。 - 示例:`SELECT DECODE('11', '22', 'BB', '33', 'CC', 'DD') FROM DUAL;` - `SIGN`: 返回数值的符号,正数为1,0为0,负数为-1。 - 示例:`...

    Oracle Decode()函数使用技巧分享

    Oracle的Decode()函数是PL/SQL中的一个非常实用的工具,尤其对于简化SQL查询和处理逻辑判断具有显著的优势。此函数允许我们在不使用复杂的IF-THEN-ELSE或CASE语句的情况下,实现条件判断和值的转换。由于Oracle是...

    Oracle_Database_11g完全参考手册.part3/3

    第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 创建和管理表、视图、索引、群集和序列 第18章 分区 第19章 Oracle基本安全 第Ⅲ部分 高级主题 第20章 高级安全性-虚拟专用数据库 第21章 高级安全性:透明数据加密...

    Oracle_Database_11g完全参考手册.part2/3

    第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 创建和管理表、视图、索引、群集和序列 第18章 分区 第19章 Oracle基本安全 第Ⅲ部分 高级主题 第20章 高级安全性-虚拟专用数据库 第21章 高级安全性:透明数据加密...

    oracle高级应用基础.pdf

    `SIGN`函数用于获取数值表达式的正负号,可以和`DECODE`函数结合使用,从而实现对数值范围的判断逻辑。 Oracle数据库的分页查询可以通过使用`ROWNUM`伪列来实现。`ROWNUM`是一个在查询结果集中生成行号的伪列,非常...

    编程学习笔记(数据库,C#)

    同时,DECODE函数可以与SIGN函数结合使用,比较两个值的正负: ``` SELECT DECODE(SIGN(5 - 6), 1, 'Is Positive', -1, 'Is Negative', 'Is Zero') FROM dual; ``` 或者使用CASE语句实现相同的效果: ``` ...

    Oracle行列转换_总结

    此外,还可以使用 `DECODE` 函数与 `SIGN()` 结合来比较字段大小,如: ```sql SELECT DECODE(SIGN(字段1 - 字段2), -1, 字段3, 字段4) FROM dual; ``` 这可以帮助在没有 `CASE WHEN` 的情况下执行简单的条件判断。 ...

    oracle常用语法

    `DECODE` 和 `CASE` 函数都可以用来实现条件判断。 **语法示例**: ```sql SELECT DECODE(sign(Emp_ID - 3), 1, '&gt;', 0, '=', ') FROM employees; ``` 这里使用 `DECODE` 函数来根据 `Emp_ID` 与 3 的比较结果来显示...

Global site tag (gtag.js) - Google Analytics