半夏微凉

半夏微凉

五、Oracle内置函数

一.数值型函数

1.绝对值,取余,正负判断函数

   绝对值:ABS(n),

   取余:MOD(n2,n1),

   正负判断:SIGN(n),

2.指数函数

   平方根:SQRT(n)

   幂函数:POWER(n1,n2)

   对数:LOG(n1,n2)

3.四舍五入截取函数

   四舍五入:ROUND(n,integer)

   取真值,无关四舍五入:TRUNC(n,integer)

二.字符型函数

1.ASCII码与字符转换函数:
   ASCII转换成字符:CHR(n)
   字符转换成ASCII码:ASCII(char)
2.获取字符串长度函数
   LENGTH(char)
   The LENGTH functionsreturn the length of char. LENGTH  calculates length usingcharacters as defined by the input character set.--返回以字符为单位的长度.
   LENGTHB usesbytes instead of characters.--返回以字节为单位的长度.
   LENGTHC usesUnicode complete characters.--返回以Unicode完全字符为单位的长度.
   LENGTH2 usesUCS2 code points.--返回以UCS2代码点为单位的长度.
   LENGTH4 usesUCS4 code points.--返回以UCS4代码点为单位的长度.
3.字符串截取函数
   SUBSTR(char,position,substring_length)
   SUBSTR返回以字符为单位的长度.
   SUBSTRB返回以字节为单位的长度.
   SUBSTRC返回以Unicode完全字符为单位的长度.
   SUBSTR2返回以UCS2代码点为单位的长度.
   SUBSTR4返回以UCS4代码点为单位的长度.
4.字符串连接函数
   CONCAT(char1,char2)
5.字符串搜索函数
   INSTR(string,position,occurrence)
6.字母大小写转换函数
   指定参数全部转换成大写字母:UPPER(char)
   指定参数全部转换成小写字母:LOWER(char)
   所有单词的首字母转化成大写字母:INITCAP(char)
7.带排序参数的字母大小写转换函数
   NLS_INITCAP(char[,nlsparam]) 将指定参数的第一个字母转换成写。

   nlsparam: 

   NLS_SORT = SCHINESE_STROKE_M 按笔画,部首排序

   NLS_SORT = SCHINESE_PINYIN_M 按拼音排序

   NLS_SORT = SCHINESE_RADICAL_M 按照部首,笔划排
8.为指定参数排序函数
   NLSSORT(char[,nlsparam])

9.替换字符串函数
   REPLACE(char,search_string[,replacement_string])
10.字符串填充函数
   RPAD(expr1,n[,expr2])  右方向填充
   LPAD(expr1,n[,expr2])   左方向填充
   注:expr2总是从左到右填充。

11.删除字符串首届指定字符的函数
   TRIM([LEADING|TRAILING|BOTH][trim_character FROM] trim_source)
   leading:删除trim_source的前缀字符
   trailing:删除trim_source的后缀字符
   both:删除trim_source的前后缀字符
   trim_character:删除的指定字段,默认删除空格
   trim_source:被操作的字符串。
例:select trim(leading 't' from 'test') from dual;
    RTRIM(char[,set])
    LTRIM(char[,set])
例:select rtrim('lentimdgsdgfgs','dgfs*') from dual
12.字符集名称和ID互换函数
    NLS_CHARSET_ID(sring)

    NLS_CHARSET_NAME(number)

三、日期型函数 

1.SYSDATE  系统时间函数

    select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

2.systimestamp  带时区的系统时间,精确到微秒。

3.dbtimezone 数据库时区

4.ADD_MONTHS(date,integer)为日期加上指定的月份函数。

 Select to_char(add_months(to_date('2015-1-30','YYYY-MM-DD'),'1'),'YYYY-MM-DD');

5.LAST_DAY(date) 返回指定月份最后一天函数

    select last_day(to_char(add_months(sysdate,3))) from dualselect last_day(to_char(add_months(sysdate,3))) from dual;

6.NEST_DAY(date,char)返回指定日期后一周的日期函数

    select sysdate,next_day(sysdate,'星期一') from dual

7.CURRENT_DATE 返回会话所在时区当前日期函数

    select sessiontimezone,to_char(current_date,'YYYY-MM-DD HH24:MI:SS') from dual;

8.extract(datetime) 提取指定日期特定部分的函数

select  extract(year from sysdate) year,

       extract (minute from timestamp ' 2015-05-04 23:15:23 ') min,

       extract (second from timestamp ' 2015-05-12 23:15:23 ') sec 

       from dual;

9.MONTHS_BETWEEN(date1,date2) 得到两个日期之间的份数

select months_between(to_date('2015-05-06', 'YYYY-MM-DD'), to_date('2015-06-06', 'YYYY-MM-DD')) one,

      months_between(to_date('2015-05-31', 'YYYY-MM-DD'), to_date('2015-06-30', 'YYYY-MM-DD')) two,

      months_between(to_date('2015-05-06','YYYY-MM-DD') ,to_date('2015-08-06','YYYY-MM-DD')) three 

from dual

10.NEW_TIME(date,timezone1,timezone2) 时区时间转换函数

11.ROUND(date[,fmt]) 日期四舍五入

    TRUNC(date[,fmt]) 日期截取函数

四、转换函数

1.ASCIISTR(char) 字符串转ASCII类型字符串函数

2.BIN_TO_NUM(data[,data...]) 二进制转十进制函数

3.CAST(expr as type_name) 数据类型转换函数

4.字符串和rowid互相转换函数

    chartorowid(char)字符串转rowid

    rowidtochar(rowid)rowid转字符串

    rowidtonchar(rowid)rowid转成字符串,返回类型为nvarchar2。

5.convert(char,转变后的字符,转变前的字符)

6.十六进制字符串与RAW类型相互转换函数

    hextoraw(char) 十六进制字符串转换成raw类型的数据

    rawtohex(raw) raw类型字符转换成十六进制字符串,返回varchar2类型

    rawtonhex(raw)raw类型字符转换成十六进制字符串,返回nvarchar2类型

7.数值转换成字符型函数

    to_char(number[,fmt[,nlsparam]]) 数值转换成字符

    to_char(date[,fmt[,nlsparam]]) 日期转换成字符

    例: select to_char(44,'99.9') from dual;

            select to_char(sysdate,'YYYY-MM-DD') ,

               to_char(sysdate,'HH:MI:ss') ,

               to_char(sysdate,'month','nls_date_language=English')  

           from dual;

8.to_date(char[,fmt[,nlsparam]]) 字符转日期型函数

   例:select to_char(to_date('2015-05-06','YYYY-MM-DD'),'month') from dual;

9.to_number(expr[,fmt[,nlsparam]]) 字符串转数字函数

10.to_single_byte(char) 将函数从全角转成半角。

五、NULL函数

1.coalesce(expr) 返回列表中第一个不为null的函数

    例:select coalesce(null,9-7,null,9);

2.lnnvl(condition)排除指定条件函数

    例:select * from table_name where lnnvl(condition [as column_name>10]);

3.nvl(expr1,expr2) 表示如果expr1为null值时,则返回expr2的值,否则返回expr1的值。

    nvl2(expr1,expr2,expr3) 同nvl类似,不同的是当expr1为null时,函数返回expr3的值,当expr1不为空时,返回expr2的值。

六、集合函数

1.avg([distinct|all]expr) 平均数函数

    dustinct:去除重复的值

    all:表示所有的值,包括重复的值,也是默认值。

    expr:表达式。只能是数值类型。

2.count(*|[distinct][all]expr) 该函数用来计算记录的数量或某列的个数。

3.max([distinct|all]expr) 返回最大值函数。

    min([distinct|all]expr) 返回最小值函数。

4.sum([distinct|all]expr) 求和函数

七、其他函数

1.user 返回登录名函数

例:select user from dual;

2.userenv(parameter) 返回当前会话的信息。

parameter:参数。(当参数为Language时返回语言,字符集;sessionid返回会话id;isdba返回当前用户是否dba)

例:select userenv('isdba') from dual;

3.sys_context(namespace,parameter) 上下文信息函数

例:select
 SYS_CONTEXT('USERENV','TERMINAL') terminal,
 SYS_CONTEXT('USERENV','LANGUAGE') language,
 SYS_CONTEXT('USERENV','SESSIONID') sessionid,
 SYS_CONTEXT('USERENV','INSTANCE') instance,
 SYS_CONTEXT('USERENV','ENTRYID') entryid,
 SYS_CONTEXT('USERENV','ISDBA') isdba,
 SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
 SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
 SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
 SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
 SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
 SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
 SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
 SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
 SYS_CONTEXT('USERENV','SESSION_USER') session_user,
 SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
 SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
 SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
 SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
 SYS_CONTEXT('USERENV','DB_NAME') db_name,
 SYS_CONTEXT('USERENV','HOST') host,
 SYS_CONTEXT('USERENV','OS_USER') os_user,
 SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
 SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
 SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
 SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
 SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
 SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE')  authentication_type,
 SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
 from dual;

4.decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 表达式匹配函数

例:比如我要查询某班男生和女生的数量分别是多少?

通常我们这么写:

select count(*) from 表 where 性别 = 男;

select count(*) from 表 where 性别 = 女;

要想显示到一起还要union一下,太麻烦了

用decode呢,只需要一句话

select decode(性别,男,1,0),decode(性别,女,1,0) from 表

使用方法:

1、比较大小

select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值

sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1

例如:

变量1=10,变量2=20

则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。

2、此函数用在SQL语句中,功能介绍如下:

Decode函数与一系列嵌套的 IF-THEN-ELSE语句相似。base_exp与compare1,compare2等等依次进行比较。如果base_exp和 第i 个compare项匹配,就返回第i 个对应的value 。如果base_exp与任何的compare值都不匹配,则返回default。每个compare值顺次求值,如果发现一个匹配,则剩下的compare值(如果还有的话)就都不再求值。一个为NULL的base_exp被认为和NULL compare值等价。如果需要的话,每一个compare值都被转换成和第一个compare 值相同的数据类型,这个数据类型也是返回值的类型。

Decode函数在实际开发中非常的有用

结合Lpad函数,如何使主键的值自动加1并在前面补0

select LPAD(decode(count(记录编号),0,1,max(to_number(记录编号)+1)),14,'0') 记录编号 from tetdmis

eg:

select decode(dir,1,0,1) from a1_interval

dir 的值是1变为0,是0则变为1

比如我要查询某班男生和女生的数量分别是多少?

通常我们这么写:

select count(*) from 表 where 性别 = 男;

select count(*) from 表 where 性别 = 女;

要想显示到一起还要union一下,太麻烦了

用decode呢,只需要一句话

select decode(性别,男,1,0),decode(性别,女,1,0) from 表

3,order by对字符列进行特定的排序

大家还可以在Order by中使用Decode。

例:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。

select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, , '外语',3)

 

 


评论回复


·