1.substr俗称字符串截取函数,一般用于对字符串(数据库的某字段)进行截取,也就是可以用于对于查询的字段进行截取后注入结果集合中。下面先看看函数的两种用法:
2.substr(string str,int index) 从字符串的index(索引)位置开始截取,截取后面所有的字符串。
substr(string str,int index,int length)从字符串的index(索引)位置开始截取,截取长度为length的字符串。
3.示例:select SUBSTR(“name”,0,3) as str from test;
结果:name=‘zhangsan’ str=‘zha’
4.substr(date,-2)可以表示按倒序截取尾数两位
1.regexp_substr函数支持正则表达式来对字符串进行切割。相应很多人都在项目中遇到过在某一个表的某一个字段中根据某些特殊符号比如","对字符串进行的拼接的数据的存储的类型。在本次项目中有这样一次需求,在一个系统之外的数据表格中对车辆的外形参数定义为:长、宽、高的数据用逗号分隔后存入了库中的一个字段中,先需要将该字段的三段分离出来,分别存入到不同的字段中,当然实现的方式可能有很多种,我采用了insert into select的方式,先用regexp_substr将该字段拆分为三个字段,再以insert into select的方式插入到了我们需要的业务表里,全程非常快速。
2.示例
select num,REGEXP_SUBSTR('num','[^,]+',1,1) as length,
select num,REGEXP_SUBSTR('num','[^,]+',1,2) as width,
select num,REGEXP_SUBSTR('num','[^,]+',1,3) as heigth,
from test where id = 1;
regexp_substr第一个参数是源字符串(数据库字段名),第二个参数是正则表达式截取规则,第三个表示从第几个字符开始匹配正则表达式,第四个参数表示标识第几个匹配组,在本例中也就是说第几个","。
1.lpad(string,n,[pad_string])函数,从左侧追加生成固定长度的字符串。
2.参数说明
string:字符或者参数
n:字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;
pad_string:可选参数,这个字符串是要粘贴到string的左边,若这个参数未写,lpad函数将会在string的左边粘贴空格。
@Select("select decode(a.name_list_tag,'GBD','Y','GBDC','Y','GBDL','Y','N') \"isGBD\"," +
"decode(c.cust_name,null,'',substr(c.cust_name,0,length(c.cust_name)-1||'*')) \"custName\"," +
"replace(c.id_no,substr(c.id_no,length(c.id_no)-11,8),'********') \"custIdNo\"," +
"to_char(c.date_first_reg,'YYYY-MM-dd') \"drivingRegistrationDate\"," +
"(select b.city_name from base_bte_l_region_info b where c.city_code = b.city_code) \"insureCity\"" +
"from appl_admin a,appl_gbd_car_info c where a.apply_no = c.apply_no and a.apply_no=#{applyNo}")
public Map getGBDCarInfo(Map map);
学习decode函数、replace函数和substr函数的使用
类似于mysql中limit的作用,限制结果行数。
select * from(select TT.*,rownum as rowno from (select * from appoint_register tab1 order by date_created) TT where rownum <= 10 ) tab2 where tab2 > 0)
解释:比较符号后的两个数字差为每页展示数量,tab2后面的数字为起始下标,rownum后面的数字为终止下标。
注意:rownum字段前面不要加表名
启用一个虚拟表
SQL语句中的拼接符号。
@Update("")
void batchSaveGBD(@Param("GBDList") List<Map<String,Object>> GBDList);
二种(与ibatis标签整合)
<insert id="insertSign" parameterClass="java.util.List">
insert all
<iterate conjunct=" ">
into t_student
(name,age)
VALUES (
#list[].name#,
#list[].age#,
)
</iterate>
</insert>
select * from dual
SELECT COALESCE (c1,c2,c3,c4,c5,c6) AS c FROM dual;
1、coalesce函数是用来获取第一个不为空的列的值
2、coalesce函数里面的数据类型,必须全部都跟第一列的数据类型一致
作用每一行上取最大值与最小值,而聚合函数max与min是作用于每一列。注意使用greast与least函数的时候要排除数据为空的情况
使用说明
create table t_1 as select * from t_old
对插入的表格的数据进行筛选
使用WITH CHECK OPTION关键字对插入数据进行控制
Insert into (select empno,ename,hiredate from emp where hiredate <= SYSDATE WITH CHECK OPTION) values (9999,'test'.sysydate +1)
insert first
when job in ('salesman','manager') then into emp1(empno,ename,job) values (empno,ename,deptno)
when deptno in ('20','30') then into emp2 (empno,ename,deptno) values (empno,ename,deptno)
select empno,ename,job,deptno from emp;
在insert first语句中,当第一个表符合条件后,第二个表将不再插入对应的行,表emp2中不再有与表emp1相同的数据EMPNO = ‘7654’
select * from v5 where regexp_like (data,'A')
like模糊查询与正则表达式组合
select * from v5 where regexp_like (data,'A6+')
+前面是子表达式6,表示至少匹配6一次
select * from v5 where regexp_like (data,'A6*')
*前面是子表达式6,表示至少匹配60次,等价于like1%
+表示匹配前面的子表达式一次或多次,*表示匹配前面的子表达式0次或者多次
select regexp_count('zhangsan,lisi,wangwu',',') from dual
得到目标字符串中,逗号的数量
select regexp_substr('zhangsan,lisi,wangwu','[^,]+',1,level),level from dual connect by <=length(translate('zhangsan,lisi,wangwu',','||'zhangsan,lisi,wangwu',','))+1
切开目标字符串并将切开的字符串按列输出
select phone, listagg(log_name, ',') within group(order by phone) logName
from int_phone
where phone = '13350162230'
group by phone
将phone列分组并将log_name同属于phone列的数值放在同一行输出。函数第一个参数是列,第二个参数是分隔符
listagg函数
这两种函数排序函数,rank相同的排名会生成同样的序号,而且其后的序号与row_number相同
dense_rank相同的排序会生成同样的函数,而且其后的排序会递增
这个函数四舍五入。
select sysdate + interval '1' day from dual;
总结:oralce中,两个DATE类型相减,结果是数值,单位是天。而两个TIMESTAMP类型相减是INTERVAL类型
lag()分析函数直接取得上一个记录的信息
lead()分析函数取得下一个记录的信息
with v1 as (
select timestamp '1981-01-02 11:02:33.55' as t1 timestamp '1981-01-01 16:30:00.30' as t2 from dual)
select extract (DAY from t1-t2)*24*60 + extract(HOUR from t1-t2)*60 + extract(MINUTE from t1-t2) as minutes from v1
总结
1.两次查询sql一起执行
2.extract函数