(1)listagg函数实现行转列:listagg() within group()。
listagg(column_a,seperator) within group(order by column_b):column_a为列字段,separator即为分隔符,column_b即为排序的字段。
例如:
SELECT
DEPT_ID ,
listagg( ,',')
WITHIN GROUP
(ORDER BY ) NAMES
FROM
SYS_USER su
WHERE
ORGAN_ID = '17000'
GROUP BY
DEPT_ID ;
(2)decode函数:条件判断时的函数。
decode(value,if1,then1,if2,then2...ifn,thenn,else):value为if1时,结果为then1,value为if2时,结果为then2,value为ifn时,结果为thenn,当value不等于任何给出的值时,则为else。decode函数可用case when函数来替代。
SELECT DECODE(SEX,'0','male','1','female','') FROM SYS_USER su ;
SELECT CASE WHEN SEX = '0' THEN 'male' WHEN SEX = '1' THEN 'female' ELSE '' END FROM SYS_USER su ;
(3)instr函数:
instr(sourceString,targetString,start,matched):第一个参数(sourceString)是被检索字符串,第二个参数(targetString)是检索字符串,第三个参数(start)是检索开始的位置,第四个参数(matched)是要找到的第几个的序号。instr返回的是检索字符串位置的函数,检索不到返回0。
#查询目标字符串在指定字符串中出现的位置
SELECT INSTR('ceshishuju','u',1,2) FROM SYS_USER su WHERE USERNAME = 'admin';
#解决in返回结果集顺序
SELECT * FROM SYS_USER su WHERE USERNAME IN('admin','001','002','003') ORDER BY INSTR('admin,001,002,003',USERNAME) ;
(4)substr函数:
substr(string,startPosition,length):表示截取字符串string从startPosition位置开始的length个字符,如果没有指定length,则返回剩余的字符。
#结果为:eshi
SELECT SUBSTR('ceshi',1,3) FROM SYS_USER su WHERE USERNAME = 'admin';
#结果为:ceshi
SELECT SUBSTR('ceshi',1) FROM SYS_USER su WHERE USERNAME = 'admin';
(5)locate函数:
locate(string1,string2,position):表示在string2中找到string1第一次出现的位置,position是指从哪个位置开始查找(没有则,从表示从开始查找)。如果string1不为null且查找不到的话返回0,如果找到则返回大于0的数字。
SELECT LOCATE(USERNAME,'ceshi admin') FROM SYS_USER su WHERE USERNAME = 'admin';