orcl (二)函数

it2026-03-31  8

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---------------ORxxxxWORLDxxxx2)使用ltrim

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

AAAAA---------------xxxxWORLDxxxxOR3)联合使用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(1、2 或 3)是支持的字符数据类型之一,则返回字符数据;如果 string_replace(1、2 或 3)是支持的 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'+ 1)FROM 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 smith7499 allen7521 ward7566 jones7654 unknow7698 unknow7782 unknow7788 unknow7839 unknow7844 unknow

 

2:使用decode比较大小select decode(sign(var1-var2),-1,var 1,var2) from dualsign()函数根据某个值是0、正数还是负数,分别返回0、1、-1sql测试select decode(sign(100-90),-1,100,90) from dual输出结果90100-90=10>0 则会返回1,所以decode函数最终取值为90反正select decode(sign(100-90),1,100,90) from dual输出结果100100-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 salALLEN 1600 low salWARD 1250 low salJONES 2975 low salMARTIN 1250 low salBLAKE 2850 low salCLARK 2450 low salSCOTT 3000 mid salKING 5000 high salTURNER 1500 low salADAMS 1100 low salJAMES 950 low salFORD 3000 mid salMILLER 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 INFOFROM EMP输出结果SMITH 800 含有sALLEN 1600 不含有sWARD 1250 不含有sJONES 2975 含有sMARTIN 1250 不含有sBLAKE 2850 不含有sCLARK 2450 不含有sSCOTT 3000 含有sKING 5000 不含有sTURNER 1500 不含有sADAMS 1100 含有sJAMES 950 含有sFORD 3000 不含有sMILLER 1300 不含有sSELECT 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,0) from emp;select sal*12工资,comm 奖金,sal*12+nvl2(comm,comm,0) from 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);、

commitINSERT INTO date_tab VALUES( TIMESTAMP'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 studentselect decode(sign(100-90),1,100,90) from dual

--DISTINCT 去重select DISTINCT STUDENT."name" from STUDENT--升序/降序select * from STUDENTwhere STUDENT."id">0order by STUDENT."name" ASC ,STUDENT."age" DESC---表别名select STUDENT."name" as "姓名" from STUDENT--备份表create TABLE newStudentAS SELECT * from STUDENT

select * from student GROUP BY STUDENT."name",STUDENT."age"HAVING(COUNT(STUDENT."name" || STUDENT."age")<2)

delete from STUDENT where STUDENT."id" not in( SELECT "MAX"(STUDENT."id") from STUDENT GROUP BY STUDENT."id",STUDENT."name")

insert into student VALUES(7,'小法',22,'男');insert into student VALUES(8,'小豆',32,'女');

savepoint a;insert into student VALUES(9,'小樱',32,'女');

rollback to savepoint a;commitselect * from student

--运算符select 1+1 from dual--连接select '小红的下午'||'在学校' from dual

转载于:https://www.cnblogs.com/wy0119/p/8052536.html

最新回复(0)