oracle函数

SELECT INITCAP('the soap') "Capitals" FROM DUAL; --首字母大写 帕斯卡命名法
select LOWER('XIAOJIANJIAN') "list" FROM DUAL; 
SELECT LOWER('MR. SCOTT MCMILLAN') "Lowercase" FROM DUAL; --全部小写
SELECT UPPER('last_name') "Uppercase"FROM DUAL;     --全部大写
SELECT CONCAT(CONCAT('last_name', '''s job category is '),student."id") "Job" FROM student WHERE student."id" =3;--连接字符串
SELECT SUBSTR('ABCDEFG',3,4) "Substring" FROM DUAL; --截取字符串
SELECT LENGTH('CANDIDE') "Length incharacters" FROM DUAL;
SELECT LENGTHB ('CANDIDE') "Length inbytes" FROM DUAL;--通过这个示例,我们可以看出来,Length 和 Lengthb 函数的一个重要用处,就是用来判断记录值里是否有中文内容。
SELECT INSTR('CORPORATE FLOOR','OR', 3, 2)"Instring" FROM DUAL;--('大字符串','小字符串')返回小字符串在大字符串中出现的位置
SELECT LPAD('Page 1',15,'*.') "LPAD example"FROM DUAL;

Lpad()函数的用法:

lpad函数将左边的字符串填充一些特定的字符其语法格式如下:   

     lpad(string,n,[pad_string])

     string:可是字符或者参数

     n:字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;

     pad_string:是个可选参数,这个字符串是要粘贴到string的左边,如果这个参数未写,lpad函数将会在string的左边粘贴空格。

    例如:

lpad('tech', 7); 将返回' tech'

lpad('tech', 2); 将返回'te'

lpad('tech', 8, '0'); 将返回'0000tech'

lpad('tech on the net', 15, 'z'); 将返回'tech on the net'

lpad('tech on the net', 16, 'z'); 将返回'ztech on the net'


Rpad()函数的用法:

rpad函数将右边的字符串填充一些特定的字符其语法格式如下:   

     rpad(string,n,[pad_string])

     string:可是字符或者参数

     n:字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;

     pad_string:是个可选参数,这个字符串是要粘贴到string的右边,如果这个参数未写,lpad函数将会在string的右边粘贴空格。

    例如:

rpad('tech', 7); 将返回' tech'

rpad('tech', 2); 将返回'te'

rpad('tech', 8, '0'); 将返回'tech0000'

rpad('tech on the net', 15, 'z'); 将返回'tech on the net'

rpad('tech on the net', 16, 'z'); 将返回'tech on the netz'

作者 在爬行中进步

ORACLE对字符串去空格处理(trim)
首先便是这Trim函数。Trim 函数具有删除任意指定字符的功能,而去除字符串首尾空格则是trim函数被使用频率最高的一种。语法Trim ( string ) ,参数string:string类型,指定要删除首部和尾部空格的字符串返回值String。函数执行成功时返回删除了string字符串首部和尾部空格的字符串,发生错误时返回空字符串("")。 如果参数值为null时,会抛出空指针异常。在oracle中,trim使用的形式多为人rtrim()与ltrim()两种,分别为去除字符串右边空格与去除字符串左边空格。

       当然trim的功能不止如此,下面进行细致的介绍,这里我多以去除字符串空格为例。

我们看下trim函数的语法描述:trim( [ {  {leading|trailing|both}  [trim_character]|trim_character}  from] trim_source

1)、不使用任何参数

SQL> select trim('   11   ') aa from dual;

AA
--
11

这是最常见的一种使用方法,都使用默认的参数,默认情况下TRIM会同时删除字符串前后出现的空格。

2)、使用both参数,效果等同于方法一不使用任何参数

SQL> select trim(both from '   11   ') aa from dual;

AA
--
11

“BOTH”参数表示同时去除字符串前后所指定的内容(默认情况下删除空格)。

3)、使用leading与trailing参数

SQL> select trim(leading from '   11  ') aa from dual;

AA
----
11

SQL> select trim(trailing from '   11  ') aa from dual;

AA
-----
   11
从结果中得分隔符'-',可以发现使用leading参数可以去除字符串右端的空格,而trailing参数则可以去除字符串左端的空格。正如oracle提供的rtrim()与ltrim()。

4)、使用trim_character参数

trim_character参数改变了“删除空格”的默认行为。如果想要删除字符串'xxxxWORLDxxxx'前后出现的“x”,“trim_character”参数就派上用场了。

SQL> select trim('x' from 'xxxxWORLDxxxx') aaaaa from dual;

AAAAA
-----
WORLD

trim_character配合“both”、“trailing”和“leading”三个参数使用效果如下,与之前演示类似。看结果,不赘述。

SQL> select trim('x' from 'xxxxWORLDxxxx') aaaaa from dual;

AAAAA
-----
WORLD

SQL> select trim(both 'x' from 'xxxxWORLDxxxx') aaaaa from dual;

AAAAA
-----
WORLD

SQL> select trim(trailing 'x' from 'xxxxWORLDxxxx') aaaaa from dual;

AAAAA
---------
xxxxWORLD

SQL> select trim(leading 'x' from 'xxxxWORLDxxxx') aaaaa from dual;

AAAAA
---------
WORLDxxxx

       必须注意的一点是这里的“trim_character”参数只允许包含一个字符,不支持多字符。trim不能满足我们去除多字符要求,但是我们可以使用rtrim和ltrim来处理。
1)使用rtrim

SQL> select rtrim('ORxxxxWORLDxxxxOR','OR') aaaaa from dual;

AAAAA
---------------
ORxxxxWORLDxxxx
2)使用ltrim

SQL> select ltrim('ORxxxxWORLDxxxxOR','OR') aaaaa from dual;

AAAAA
---------------
xxxxWORLDxxxxOR
3)联合使用RTRIM和LTRIM函数达到我们的目的
SQL> select rtrim(ltrim('ORxxxxWORLDxxxxOR','OR'),'OR') aaaaa from dual;

AAAAA
-------------
xxxxWORLDxxxx

使用rtrim和ltrim函数时的注意事项:“OR”不表示整个“OR”字符串进行匹配,而是发现任意的字符“O”或字符“R”均做删除操作。

       对于trim函数的应用就介绍到,下面介绍一下replace函数,个人觉得replace函数在去空格时更好用。replace 函数用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。来看下replace函数的语法描述:replace('string_replace1','string_replace2','string_replace3')  

'string_replace1' 待搜索的字符串表达式,string_replace1 可以是字符数据或二进制数据。

'string_replace2' 待查找的字符串表达式,string_replace2 可以是字符数据或二进制数据。

'string_replace3' 替换用的字符串表达式,string_replace3 可以是字符数据或二进制数据。

返回类型,如果 string_replace(123)是支持的字符数据类型之一,则返回字符数据;如果 string_replace(123)是支持的 binary 数据类型之一,则返回二进制数据。

       这里我们依然以去空格为例。

SQL> select replace('   aa  kk  ',' ','') abcd from dual;

ABCD
----
aakk

       与使用trim函数的结果进行对比,我们可以发现,使用replace函数不仅可以去除字符串两端的空格,也可去除字符串内部的空格。

       当然,如果只是要去除字符串两端的空格,使用trim函数效率会更高
----------------------------------------------------------------------

TO_CHAR(数字)
句法

to_char_number :: =

to_char_number.gif的描述如下
图示说明to_char_number.gif

目的

TO_CHAR(数字)使用可选的数字格式转换n为VARCHAR2数据类型的值fmt。该值n可以是类型的NUMBER,BINARY_FLOAT或BINARY_DOUBLE。如果省略fmt,则n转换为VARCHAR2足够长的值以保存其有效数字。

有关数字格式的信息,请参阅“格式模型”。

该'nlsparam'参数指定由数字格式的元素返回这些字符:

小数字符
组分隔符
当地的货币符号
国际货币符号
这个论点可以有这样的形式:

'NLS_NUMERIC_CHARACTERS ='' dg ''
   NLS_CURRENCY ='' 文字 ''
   NLS_ISO_CURRENCY = 地区 '

字符d和g表示十进制字符和组分隔,分别。它们必须是不同的单字节字符。在引用的字符串中,必须在参数值周围使用两个单引号。十个字符可用于货币符号。

如果省略'nlsparam'或任何一个参数,则此函数使用会话的默认参数值。

例子

以下语句使用隐式转换将字符串和数字组合成一个数字:

SELECT TO_CHAR('01110'+ 1FROM dual;

TO_C
----
1111

将此示例与TO_CHAR(character)的第一个示例进行比较。

在下一个示例中,输出在货币符号的左侧填充为空白。

SELECT TO_CHAR(-10000'L99G999D99MI')“金额”
     FROM DUAL;

量
--------------
  $ 10,000.00-

SELECT TO_CHAR(-10000'L99G999D99MI''NLS_NUMERIC_CHARACTERS ='',。''
   NLS_CURRENCY ='AusDollars''')“金额”
     FROM DUAL;

量
-------------------
AusDollars10.000,00-

在可选数字格式中fmt,L指定本地货币符号并MI指定尾部减号。有关数字格式元素的完整列表,请参阅表2-17“使用FX格式模型修改器匹配字符数据和格式模型”。

---------------------------------------------------------------------------------------------------------------------
round(x[,y]) 
【功能】返回四舍五入后的值 
【参数】x,y,数字型表达式,如果y不为整数则截取y整数部分,如果y>0则四舍五入为y位小数,如果y小于0则四舍五入到小数点向左第y位。 
【返回】数字 
【示例】 select round(5555.6666,2.1),round(5555.6666,-2.6),round(5555.6666) from dual; 
返回: 5555.67 , 5600 , 5556 
【相近】trunc(x[,y]) 返回截取后的值,用法同round(x[,y]),只是不四舍五入 

trunc(x[,y]) 
【功能】返回x按精度y截取后的值 
【参数】x,y,数字型表达式,如果y不为整数则截取y整数部分,如果y>0则截取到y位小数,如果y小于0则截取到小数点向左第y位,小数前其它数据用0表示。 
【返回】数字 
【示例】 select trunc(5555.66666,2.1),trunc(5555.66666,-2.6),trunc(5555.033333) from dual; 
返回:5555.66 5500 5555 
【相近】round(x[,y]) 返回截取后的值,用法同trunc(x[,y]),只是要做四舍五入




decode的几种用法
1:使用decode判断字符串是否一样
DECODE(value,if1,then1,if2,then2,if3,then3,...,else)
含义为
IF 条件=值1 THEN
    RETURN(value 1)
ELSIF 条件=值2 THEN
    RETURN(value 2)
    ......
ELSIF 条件=值n THEN
    RETURN(value 3)
ELSE
    RETURN(default)
END IF


sql测试
select empno,decode(empno,7369,'smith',7499,'allen',7521,'ward',7566,'jones','unknow') as name from emp where rownum<=10
输出结果
7369 smith
7499 allen
7521 ward
7566 jones
7654 unknow
7698 unknow
7782 unknow
7788 unknow
7839 unknow
7844 unknow




2:使用decode比较大小
select decode(sign(var1-var2),-1,var 1,var2) from dual
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
sql测试
select decode(sign(100-90),-1,100,90) from dual
输出结果
90
100-90=10>0 则会返回1,所以decode函数最终取值为90
反正
select decode(sign(100-90),1,100,90) from dual
输出结果
100
100-90=10>0返回1,判断结果为1,返回第一个变量100,最终输出结果为100




3:使用decode函数分段
工资大于5000为高薪,工资介于3000到5000为中等,工资小于3000为低薪
sql测试
SELECT 
    ename,sal,
    DECODE(SIGN(sal - 5000),
            1,
            'high sal',
            0,
            'high sal',
            - 1,
            DECODE(SIGN(sal - 3000),
                    1,
                    'mid sal',
                    0,
                    'mid sal',
                    - 1,
                    DECODE(SIGN(sal - 1000),
                            1,
                            'low sal',
                            0,
                            'low sal',
                            - 1,
                            'low sal')))
FROM
    emp
输出结果
SMITH   800    low sal
ALLEN 1600  low sal
WARD 1250  low sal
JONES 2975  low sal
MARTIN 1250  low sal
BLAKE   2850  low sal
CLARK 2450  low sal
SCOTT 3000  mid sal
KING  5000  high sal
TURNER 1500  low sal
ADAMS 1100  low sal
JAMES 950          low sal
FORD 3000  mid sal
MILLER 1300  low sal


4:利用decode实现表或者试图的行列转换
sql测试
SELECT 
       SUM(DECODE(ENAME,'SMITH',SAL,0))  SMITH,
       SUM(DECODE(ENAME,'ALLEN',SAL,0))  ALLEN,
       SUM(DECODE(ENAME,'WARD',SAL,0))   WARD,
       SUM(DECODE(ENAME,'JONES',SAL,0))  JONES,
       SUM(DECODE(ENAME,'MARTIN',SAL,0)) MARTIN FROM EMP
输出结果如下
SMITH  ALLEN  WARD   JONES  MARTIN
  800  1600    1250       2975       1250


5:使用decode函数来使用表达式来搜索字符串
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)
decode函数比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。
sql测试
SELECT 
    ENAME,
    SAL,
    DECODE(INSTR(ENAME, 'S'),
            0,
            '不含有s',
            '含有s') AS INFO
FROM
    EMP
输出结果
SMITH 800            含有s
ALLEN 1600    不含有s
WARD 1250    不含有s
JONES 2975     含有s
MARTIN 1250     不含有s
BLAKE 2850     不含有s
CLARK 2450     不含有s
SCOTT 3000    含有s
KING 5000    不含有s
TURNER 1500    不含有s
ADAMS 1100    含有s
JAMES 950             含有s
FORD 3000    不含有s
MILLER 1300    不含有s
SELECT name, RPAD(' ', salary/1000/1, '*') "Salary"
 FROM student
 WHERE STUDENT.'id' = 3
 ORDER BY name;

SELECT RTRIM('BROWNING: ./=./=./=./=./=.=','/=.') "RTRIM example" FROM DUAL--去除空格
select trim('   11   ') aa from dual;
SELECT name, TREAT(VALUE(p) AS dual).salary salary 
  FROM persons p;
SELECT

--nvl和nvl2 滤空函数
SELECT sal*12工资,comm 奖金,sal*12+nvl(comm,0from emp;
select sal*12工资,comm 奖金,sal*12+nvl2(comm,comm,0from emp;

SELECT TO_CHAR(SYSDATE, 'Day DD Month YYYY') Today
 FROM DUAL;
 

SELECT TO_CHAR('01110' + 1) FROM dual; --对数字的转换

SELECT TO_CHAR(-10000,'L99G999D99MI') "Amount"
     FROM DUAL;
CREATE TABLE date_tab(
   ts_col TIMESTAMP,
   tsltz_col TIMESTAMP,
   tstz_col TIMESTAMP WITH TIME ZONE);、

commit
INSERT INTO date_tab VALUESTIMESTAMP'1999-12-01 10:00:00'TIMESTAMP'1999-12-01 10:00:00'TIMESTAMP'1999-12-01 10:00:00');
SELECT SESSIONTIMEZONE, 
   TO_CHAR(tsltz_col,'DD-MON-YYYY HH24:MI:SSxFF'FROM date_tab;

1.Round():四舍五入
select round(5555.6666,2.1),round(5555.6666,-2.6),round(5555.6666) from dual; 
select trunc(5555.66666,2.1),trunc(5555.66666,-2.6),trunc(5555.033333) from dual; 

select sum(DECODE(C810000125,'',1,0))/COUNT(1) 合格率 FROM t581 

select decode(grand,'',1) from student
select decode(sign(100-90),1,100,90) from dual
原文地址:https://www.cnblogs.com/lcycn/p/8047975.html