一、decode
在Oracle/PLSQL中, decode 具有和 IF-THEN-ELSE 一样的功能。
decode 函数语法如下:
decode( expression , search , result [, search , result]... [, default] )
expression 要比较的表达式.
search 要与expression 比较的字段。.
result 如果expression 与search 一样的话,返回该结果。.
default 此参数可选,如果没有与expression 匹配上的search . 就返回此结果,如果此参数没有设置,当没有与expression匹配上的search时,返回null。
search 和 result可成对出现多次,代表各种要匹配的情况。
应用于
- Oracle 9i, Oracle 10g, Oracle 11g
例如:
You could use the decode function in an SQL statement as follows:
select supplier_name,decode(supplier_id,1000,'IBM',10001,'Microsoft','1002','Hewlett Packard','Gateway') result from suppliers;
上面的sql语句相当于下面的IF-THEN-ELSE :
IF supplier_id = 10000 THEN
result := 'IBM';
ELSIF supplier_id = 10001 THEN
result := 'Microsoft';
ELSIF supplier_id = 10002 THEN
result := 'Hewlett Packard';
ELSE
result := 'Gateway';
END IF;
decode 函数会挨个匹配supplier_id 的值.
常见问题:
问题1: 现在一个阅读者想问,怎么使用decode函数来比较两个日期呢?(例如:date1 和 date2), 如果date1 > date2, decode 函数返回date2. 否则decode函数返回 date1.
回答: 要实现上述要求,可使用decode函数如下:
decode((date1 - date2) - abs(date1 - date2), 0, date2, date1)
如果date1大于date2,下面表达是会等于0:
(date1 - date2) - abs(date1 - date2)
帮助性提示: 可用decode函数绑定SIGN 函数 像下面这样:
上面比较日期的语句可修改如下:
DECODE(SIGN(date1-date2), 1, date2, date1)
SIGN/DECODE 联合对于有关销售红利等数字方面的比较是非常有用的。
DECODE(SIGN(actual-target), -1, 'NO Bonus for you', 0,'Just made it', 1, 'Congrats, you are a winner')
问题2: 我想知道是否可以用decode函数来确定数字范围,例如 1-10 = 'category 1', 11-20 = 'category 2', 比一个一个比较应该会好一点吧.
回答: 不幸的告诉你,不可以用decode函数来确定数字的范围. 可是你可以试着创建一个表达式,这个表达式可以得一个数字指定的范围, 下一个数字对应下一个指定的范围, 以此类推.
例如:
select supplier_id,decode(trunc((supplier_id-1)/10),0,'category 1',1,'category 2',2,'category 3','unknown') result from suppliers;
这个例子基于这个公式:trunc ((supplier_id - 1) / 10
如果supplier_id在1和10之间,表达式计算值=0.
如果supplier_id在11和20之间,表达式计算值=1.
如果supplier_id在21和30之间,表达式计算值=3.
等等;
问题3: 我想写一个decode函数,要求如下:
如果 yrs_of_service < 1 返回 0.04
如果 yrs_of_service >= 1 and < 5 返回0.04
如果 yrs_of_service > 5 返回 0.06
这种情况我该怎么做呢?
回答: You will need to create a formula that will evaluate to a single number for each one of your ranges.
For example:
select emp_name,decode(trunc((yrs_of_service+3)/4),0,0.04,1,0.04,0.06) as perc_value from employees;
问题4: decode函数的参数个数有限制吗?我得到一个错误 "ORA-00939: too many arguments for function".
回答: 是的,decode函数的最大参数个数为255个,包括expression, search, and result arguments.<!-- InstanceEndEditable -->
-------------------------------------------------------------------------------------------------------------
二、sign
在Oracle/PLSQL中, sign 函数返回一个数字的正负标志.
语法如下:sign( number )
number 要测试标志的数字.
If number < 0, then sign returns -1.
If number = 0, then sign returns 0.
If number > 0, then sign returns 1.
应用于:
-
Oracle 8i, Oracle 9i, Oracle 10g, Oracle 11g
例如:
sign(-23) |
would return -1 |
sign(0.001) |
would return -1 |
sign(0) |
would return 0 |
sign(0.001) |
would return 1 |
sign(23) |
would return 1 |
sig(23.601) |
would return 1
|
----------------------------------------------------------------------------------------------------
三、trunc(number)
在Oracle/PLSQL中, trunc function returns a number truncated to a certain number of decimal places.
trunc function 语法如下:
trunc( number, [ decimal_places ] )
number 要截取的数字.
decimal_places 要保留的小数位. 这个参数必须是个整数. 如果此参数缺省,默认保留0位小数
应用于:
- Oracle 8i, Oracle 9i, Oracle 10g, Oracle 11g
例如For example:
trunc(125.815) |
would return 125 |
trunc(125.815, 0) |
would return 125 |
trunc(125.815, 1) |
would return 125.8 |
trunc(125.815, 2) |
would return 125.81 |
trunc(125.81, 3) |
would return 125.81 |
trunc(-125.815, 2) |
would return -125.81 |
trunc(125.815, -1) |
would return 120 |
trunc(125.815, -2) |
would return 100 |
trunc(125.81, -3) |
would return 0 |
如果decimal_places 大于number 本身的小数位数,返回原数字不会加0.
如:trunc(125.81,3) would return 125.81;
如果decimal_places 为负数,那么将指定的位数
分享到:
相关推荐
22. TRUNC函数:将数字截断至指定的小数位数。 日期函数 1. ADD_MONTHS函数:在日期上增加指定的月份数。 2. LAST_DAY函数:返回给定月份中的最后一天。 3. MONTHS_BETWEEN函数:计算两个日期之间的月份差异。 4. ...
2. **TRUNC函数**:截断数值到指定的小数位数,没有指定则截断到整数。 3. **POWER函数**:计算数值的幂次。 4. **ABS函数**:返回数值的绝对值。 5. **MOD函数**:返回两个数相除的余数。 6. **SIGN函数**:根据...
Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的内置函数,以支持复杂的查询和数据处理。在Oracle中,函数是执行特定任务的预定义SQL或PL/SQL代码块,它们可以帮助我们处理和转换数据。让我们深入...
本文将详细介绍Oracle中一些最常用的函数及其使用方法,这些函数包括`DECODE`、`ABS`、`CEIL`、`MOD`、`ROUND`、`TRUNC`、`CONCAT`、`LOWER`和`LPAD`。 #### 二、DECODE函数:条件判断与转换 **功能描述**:`...
在Oracle数据库中,函数是一类预定义的子程序,它可以对输入参数执行运算,并返回一个结果值。Oracle提供了一系列的函数,用于处理不同类型的数据,如字符串、数字、日期和时间等。下面按照文档所提供的内容,详细...
### ORACLE函数及其用法详解 #### 概述 Oracle是一种广泛使用的数据库管理系统,它提供了丰富的内置函数,这些函数能够帮助开发者和数据库管理员更高效地处理数据。本文将详细介绍Oracle中的一些常用函数及其应用...
根据提供的标题和描述,本文将详细介绍在MySQL、SQL Server以及Oracle数据库中常用的函数。这些函数主要分为几大类:字符串处理函数、数值处理函数、日期处理函数、转换函数以及其他一些特殊用途的函数。 ### 字符...
ORACLE函数大全 ________________________________________ 作者:[本站编辑] 来源:[CSDN] 浏览:[ ] SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,...
附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 第1部分 关键的数据库概念 第1章 OracleDatabase11g体系结构 1.1 数据库和实例 1.2 数据库技术 1.2.1 存储数据 1.2.2 数据保护 1.2.3...
附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 第1部分 关键的数据库概念 第1章 OracleDatabase11g体系结构 1.1 数据库和实例 1.2 数据库技术 1.2.1 存储数据 1.2.2 数据保护 1.2.3...
可以使用函数,如SIGN、CEIL、FLOOR、ROUND、TRUNC等。 * 字符型:可以使用连接运算符||,可以使用函数,如LENGTH、UPPER、LOWER、INITCAP等。 * 日期型:可以使用日期函数,如SYSDATE、ADD_MONTHS、MONTHS_BETWEEN...
- 主查询中使用 `DECODE` 函数来确定周一和周末的日期。当 `SUN.THE_DAY - MON.THE_DAY` 的结果为负数时,表示当前计算的是上一周的情况,需要对周末日期加7天或对周一日期减7天。 - `SUN.THE_WEEK = MON.THE_WEEK...
SELECT DECODE(sign, 1, 'Positive', -1, 'Negative', 0, 'Zero') FROM dual; ``` 通过以上内容,我们了解了 Oracle 数据库中一些重要的函数及其使用方法。这些函数的应用对于日常的数据处理和分析具有重要意义,...
第一部分 Oracle SQL*PLUS基础 23 第一章 Oracle数据库基础 23 §1.1 理解关系数据库系统(RDBMS) 23 §1.1.1 关系模型 23 §1.1.2 Codd十二法则 24 §1.2 关系数据库系统(RDBMS)的组成 24 §1.2.1 RDBMS 内核 24...
以上内容详细介绍了Oracle数据库中常用的PL/SQL概念以及内置函数,这些函数可以帮助开发人员更高效地管理和操作数据库中的数据。熟练掌握这些函数对于提高查询效率和编写高质量的SQL代码至关重要。
- **单行函数**:如`SUBSTR`用于提取字符串的一部分,`TO_NUMBER`、`TO_CHAR`、`TO_DATE`进行数据类型转换,`TRUNC`截断日期或数字,`LOWER`、`UPPER`转换大小写,`DECODE`进行条件判断。 - **组函数**:如`AVG`...
- **数学函数**:`ROUND()`、`TRUNC()`、`FLOOR()`、`CEIL()`、`MOD()`、`SIGN()`、`POWER()` - **日期函数**:`ADD_MONTHS()`、`MONTHS_BETWEEN()`、`LAST_DAY()`、`NEXT_DAY()` - **聚合函数**:`MAX()`、`MIN()`...
- `DECODE`:条件判断函数,类似`CASE`语句。 #### 四、SELECT语句应用 - **分组查询** - `GROUP BY`子句:根据一个或多个列对结果集进行分组。 - `HAVING`子句:过滤`GROUP BY`后的分组。 - **多表查询**:...
sum(decode(sign(trunc(d.create_time,'year')-trunc(sysdate,'year')),0, d.credit_unposted+d.credit_posted, 0)) CREDIT_AMOUNT from ACCOUNT_DAILY_VEIW d group by d.ACCOUNT_ID ) loop v_account_month :...