Oracle函数(更新中)

1,case when用法

从表中根据时间点不同查询出活动的状态。

select t.*,(case when (t.start_date <= sysdate and t.end_date >= sysdate)then '报名中'
          when  t.fw_date_z < sysdate then '已结束'
          when (t.fw_date <= sysdate and t.fw_date_z >= sysdate)then '进行中'
          when (t.fw_date_z is null and t.fw_date < sysdate) then '已结束'
          else '进行中' end)as hdzt,
        (select b.fczs_id from zyfw_fczs b where b.zyfw_id = t.zyfw_id and rownum=1) as fczs_id
        from zyfw_main t,zyfw_zyz a
          where t.zyfw_id=a.zyfw_id  and t.status='2';

2,trunc函数的用法

select trunc(sysdate-1) from dual t;--昨天
select trunc(sysdate+1) from dual t;--明天
select trunc(sysdate, 'yy') from dual;--当年第一天
select trunc(sysdate, 'year') from dual;--当年第一天
select trunc(sysdate, 'yyyy') from dual;--当年第一天
select trunc(sysdate, 'q') from dual;--当前时间所在的季度的第一天
select trunc(sysdate, 'mm') from dual;--当月第一天
select trunc(sysdate, 'month') from dual;--当月第一天
select trunc(sysdate, 'd') from dual;--返回本周的第一天(周日为第一天)
select trunc(sysdate,'day') from dual;--返回本周的第一天(周日为第一天)
select trunc(sysdate, 'iw') from dual;--本周第二天(周日为第一天)
select trunc(sysdate, 'hh') from dual; --当前时间,精确到小时
select trunc(sysdate, 'hh24') from dual;--当前时间。精确到小时
select trunc(sysdate, 'mi') from dual;--当前时间。精确到分钟 没有精确到秒的精度

3,substr函数

substr函数格式 (俗称:字符截取函数)
  格式1: substr(string string, int a, int b);
  格式2:substr(string string, int a) ;
解释:
格式1:
1、string 需要截取的字符串
2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
3、b 要截取的字符串的长度
格式2:
1、string 需要截取的字符串
2、a 可以理解为从第a个字符开始截取后面所有的字符串。

select substr(sysdate,0,10) from dual;  //截取当前日期(格式为2019-08-06)

4,extract函数

要从表格myTable中选取time字段中年份为2018年的所有数据

select title,play,time from myTable where extract(year from time) = 2018;
select title,play,to_char(time, 'YYYY-MM-DD') as time from myTable where extract(year from time) = 2018;

要从表格myTable中选取time中月份为5的所有数据

select title,play,time from myTable extract(month from time) = 5;
select title,play,to_char(time, 'YYYY-MM-DD') as time from myTable where extract(month from time) = 5;

从表格myTable中选取time中日期为6的所有数据

select title,play,time from myTable extract(day from time) = 6;
slect title,play,to_char(time, 'YYYY-MM-DD') as time from myTable where extract(day from time) = 6;

语法如下:extract(year|month|day|hour|minute|second from column_name) = value

5,NVL()函数

(1)NVL(X,VALUE)

如果X为空,返回value,否则返回X

该函数的目的是把一个空值(null)转换成一个实际的值。其表达式的值可以是数字型、字符型和日期型。但是表达式1和表达式2的数据类型必须为同一个类型。

例如:对工资是2000元以下的员工,如果没发奖金,每人奖金100元

 SELECT ENAME,JOB,SAL,NVL(COMM,100) FROM EMP WHERE SAL<2000;

(2)NVL2(x,value1,value2)

如果x非空,返回value1,否则返回value2。

例如:对EMP表中工资为2000元以下的员工,如果没有奖金,则奖金为200元,如果有奖金,则在原来的奖金基础上加100元

SELECT ENAME,JOB,SAL,NVL2(COMM,comm+100,200) "comm" FROM EMP WHERE SAL<2000;

6,with as 用法

相当于建了个e临时表。

with e as (select * from scott.emp e where e.empno=7499)
select * from e;

7,oracle批量插入

Mapper接口

int insterZqyjList(List<YzsylgkZqyj> zqyjList);

Mapper.xml文件

<insert id="insterZqyjList" parameterType="List">
  insert into YZSYLGK_ZQYJ (YJ_ID, ID, YJ_NR,
  TCR_NAME, TCRDW, CREATEDATE,
  MODIFYDATE, USER_ID, ORG_ID
  ) select a.* from(
  <foreach collection="list" item="item" index="index" separator="union" open="(" close=")">
    select #{item.yjId,jdbcType=VARCHAR}, #{item.id,jdbcType=VARCHAR}, #{item.yjNr,jdbcType=VARCHAR},
    #{item.tcrName,jdbcType=VARCHAR}, #{item.tcrdw,jdbcType=VARCHAR}, #{item.createdate,jdbcType=TIMESTAMP},
    #{item.modifydate,jdbcType=TIMESTAMP}, #{item.userId,jdbcType=VARCHAR}, #{item.orgId,jdbcType=VARCHAR} from dual
  </foreach>
  )a
</insert>

这里打断一下,增加一个mysql的批量插入操作。

<insert id="insertAll" parameterType="List">
    insert into kp_file_services_contend (contend_id, services_id, contend_type,
      model, specification, duration,
      price, num, total_price
      ) values
    <foreach collection="list" item="item" index="index" separator=",">
      (
      #{item.contendId,jdbcType=VARCHAR},#{item.servicesId,jdbcType=VARCHAR},#{item.contendType,jdbcType=VARCHAR},
      #{item.model,jdbcType=VARCHAR},#{item.specification,jdbcType=VARCHAR},#{item.duration,jdbcType=VARCHAR},
      #{item.price,jdbcType=DECIMAL},#{item.num,jdbcType=VARCHAR},#{item.totalPrice,jdbcType=DECIMAL}
      )
    </foreach>
  </insert>

(1) oracle批量更新

<update id="updateBatch"  parameterType="java.util.List">
    <foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
        update T_CITY_INDEX t
        set
        t.city_name= #{item.cityName,jdbcType=VARCHAR} ,
        t.district_name= #{item.districtName,jdbcType=VARCHAR} ,
        where t.id = #{item.id,jdbcType=NUMERIC}
    </foreach>
</update>

8,字符函数

字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。

常用的字符函数有:

函数 说明
concat(x,y) 连接字符串x和y
length(x) 返回x的长度
lower(X) 把X变成小写
upper(x) 把x变成大写
REPLACE(X,old,new) 在X中查找old,并替换成new
concat(x,y) 连接字符串x和y

(1) trim()、ltrim()、rtrim()的用法

trim(string):去除指定字符串string的左右空格,当然,string中间有空格的时候是不会被去除。

SELECT trim('    aaa  bbb  ccc     ')  trim FROM dual;
aaa  bbb  ccc

ltrim(string)、rtrim(string):分别去除指定字符串string左侧和右侧的空格。

SELECT ltrim('    aaa  bbb  ccc     ') ltrim FROM dual;
aaa  bbb  ccc     --(注意,此时返回的字符串右侧是有空格的)
SELECT rtrim('    aaa  bbb  ccc     ') rtrim FROM dual;
   aaa  bbb  ccc  --(显然此时返回的字符串左侧是有空格的)

trim( leading | trailing | both string1 FROM string2):从string2中去除左侧 | 右侧 | 左侧两侧(默认是both,即左右侧都去掉)的string1字符,注意,string1只能是单个字符。

SELECT trim(leading  '  '  from  '    aaa  bbb  ccc   ') leadingtrim FROM dual;
aaa  bbb  ccc   --(注意,此时返回的字符串右侧是有空格的)
SELECT trim(trailing  '  '  from  '    aaa  bbb  ccc   ') trailingtrim FROM dual;
    aaa  bbb  ccc  --(显然,此时返回的字符串左侧是有空格的)
SELECT trim(both '  '  from  '    aaa  bbb  ccc   ') bothtrim FROM dual;
aaa  bbb  ccc  --(返回的字符串两侧的空格都被去掉)

ltrim(string1,string2),rtrim(string1,string2):从字符串string1左侧(右侧)开始去除与string2字符集合中单个字符匹配的字符,直到在string1中遇上某个字符,该字符不在string2字符集合中。

SELECT ltrim('abcxcba','abc') ltrim FROM dual;
xcba  --(结果并不是只剩一个“x”,而是包括stirng1中“x”以及右侧的字符)
SELECT rtrim('abcxcba','abc') rtrim FROM dual;
abcx  --(结果并不是只剩一个“x”,而是包括stirng1中“x”以及左侧的字符)

9,ROUND(X[,Y])和 TRUNC(x[,y])的用法

  • ROUND(X[,Y]),四舍五入。

    • ? 在缺省 y 时,默认 y=0;比如:ROUND(3.56)=4。
    • y 是正整数,就是四舍五入到小数点后 y 位。ROUND(5.654,2)=5.65。
    • y 是负整数,四舍五入到小数点左边|y|位。ROUND(351.654,-2)=400。
  • TRUNC(x[,y]),直接截取,不四舍五入。
    • 在缺省 y 时,默认 y=0;比如:TRUNC (3.56)=3。
    • Y是正整数,就是四舍五入到小数点后 y 位。TRUNC (5.654,2)=5.65。
    • y 是负整数,四舍五入到小数点左边|y|位。TRUNC (351.654,-2)=300。

10,日期函数

(1) ADD_MONTHS(d,n)

在某一个日期 d 上,加上指定的月数 n,返回计算后的新日期。

d 表示日期,n 表示要加的月数。

SELECT SYSDATE,add_months(SYSDATE,5) FROM dual;

(2) LAST_DAY(d)

返回指定日期当月的最后一天。

SELECT SYSDATE,last_day(SYSDATE) FROM dual;

(3)EXTRACT(fmt FROM d)

fmt 为:YEAR、MONTH、DAY、HOUR、SECOND。其中 YEAR、MONTH、DAY 可以为 DATA 类型匹配,也可以与 TIMESTAMP 类型匹配;但是 HOUR、MINUTE、SECOND 必须与 TIMESTAMP 类型匹配。

select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') "date",
    extract(YEAR FROM SYSDATE) "year",
    extract(MONTH FROM SYSDATE) "month",
    extract(DAY FROM SYSDATE) "day",
    extract(HOUR FROM SYSTIMESTAMP) "hour",
    extract(MINUTE FROM SYSTIMESTAMP) "minute",
    extract(SECOND FROM SYSTIMESTAMP) "second"
    from dual;  

date                      year   month     day    hour  minute     second
------------------- ---------- ------- ------- ------- ------- ----------
2012/04/03 18:53:42       2012       4       3   10         53      42.79 

(4)ROUND(d[,fmt])

返回一个以fmt为格式的四舍五入日期值 。如果fmt为“YEAR”则舍入到某年的1月1日,即前半年舍去,后半年作为下 一年

如果fmt为“MONTH”则舍入到某月的1日,即前月舍去,后半月作为下一 月

默认为“DDD”,即月中的某一天,最靠近的天,前半天舍去,后半天作为第二天

如果fmt为“DAY”则舍入到最近的周的周日,即上半周舍去,下半周作为下 一周周日

select sysdate,round(sysdate),round(sysdate,'ddd'),
round(sysdate,'day'),round(sysdate,'month'),round(sysdate,'year') from dual;
-----结果------
 2017-09-13 16:11:13 , 2017-09-14 00:00:00 , 2017-09-14 00:00:00 ,
 2017-09-17 00:00:00 , 2017-09-01 00:00:00 , 2018-01-01 00:00:00

11,转换函数

(1)TO_CHAR(d|n[,fmt])

to_char函数的功能是将数值型或者日期型转化为字符型。

select to_char(ENDTIME,'YYYY-MM-DD') ENDTIME FROM tablename;

(2)TO_DATE(X,[,fmt])

把一个字符串以fmt格式转换成一个日期类型。

to_date(sysdate,'yyyy-MM-dd HH24:mi:ss') --mi是分钟

12,聚合函数

聚合函数同时对一组数据进行操作,返回一行结果,比如计算一组数据的总和,平均值等。

名称 作用
AVG 平均值
SUM 求和
MIN/MAX 最小值/最大值
COUNT 统计
--求本月所有员工的基本工资总和
SELECT SUM(sal) FROM emp;
--求不同部门的平均工资
SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO;
----结果------
30    1566.66666
20     2175
10    2916.66666

13,Oracle wm_concat()函数

wm_concat()函数是oracle中独有的,mysql中有一个group_concat()函数。这两个函数的作用是相同的,它们的功能是:实现行转列功能,即将查询出的某一列值使用逗号进行隔开拼接,成为一条数据。

例如:shopping表

例如:shopping表

u_id        goods       num
1           苹果          2
2           梨子          5
1           西瓜          4
3           葡萄          1

想要的结果为:

u_id        goodsnum
1           苹果,西瓜
2           梨子
3           葡萄

就是下面的sql语句

select u_id, wmsys.wm_concat(goods) goods_sum from shopping group by u_id ;

想要的结果2为:

u_id                    goodsnum
1               苹果(2斤),西瓜(4斤)
2                       梨子(5斤)
3                       葡萄(1斤)

则是下面的sql语句

select u_id, wmsys.wm_concat(goods || ‘(‘ || num || ‘斤)‘ ) goods_sum from shopping group by u_id;

14,mybatis模糊查询

<select id="findzzjf" parameterType="cn.com.qianlong.light.vo.zzjf.ScoreMainOrgVo" resultType="cn.com.qianlong.light.vo.zzjf.ScoreMainOrgVo">
    select org_id,org_name,scoreyear,score,orgplace from score_main_org
    <where>
        <if test="orgName != null and orgName != ''">
            and org_name like '%'||#{orgName,jdbcType=VARCHAR}||'%'
        </if>
    </where>
    </select>

15,oracle复制表(把b表的数据复制到a表)

如果两表字段相同,则可以直接这样用。

insert into table_a select * from table_b

如果两表字段不同,a表需要b中的某几个字段即可,则可以如下使用

insert into table_a(field_a1,field_a2,field_a3) select field_b1,field_b2,field_b3) from table_b

以上语句前提条件是每个字段对应的字段类型相同或可以自动转换。

16,find_in_set()函数的使用

find_in_set的语法如下
FIND_IN_SET(str,strlist);
其中str为要查询的目标字符串, strlist为字符串的集合

INSERT INTO   tb_test   VALUES (1, 'name', 'mike,allen,jack,jay');
INSERT INTO   tb_test   VALUES (2, 'name2', 'jay,pojo,jay');
INSERT INTO   tb_test   VALUES (3, 'name3', 'allen,mike,yago');

使用FIND_IN_SET进行查询含有jay的list
SELECT id,name,list from tb_test WHERE FIND_IN_SET(‘jay‘,list);

17,oracle Extract 函数

oracle中extract()函数从oracle 9i中引入,用于从一个 date 或者interval类型中截取到特定的部分

//我们只可以从一个date类型中截取year,month,day    (    date    日期的格式为yyyy-mm-dd);
//我们只可以从一个timestamp with time zone 的数据类型中截取TIMEZONE_HOUR和TIMEZONE_MINUTE;
select extract(year from date '2011-05-17') year from dual;
          YEAR
----------
          2011
select extract( month from date '2011-05-17') month from dual;
         MONTH
----------
             5
select extract(day from date '2011-05-17') day from dual;
           DAY
----------
            17   

获取两个日期之间的具体时间间隔,extract函数是最好的选择

select extract(day from dt2-dt1) day
          ,extract(hour from dt2-dt1) hour
          ,extract(minute from dt2-dt1) minute
          ,extract(second from dt2-dt1) second
from (select to_timestamp('2011-02-04 15:07:00','yyyy-mm-dd hh24:mi:ss') dt1 ,to_timestamp('2011-05-17 19:08:46','yyyy-mm-dd hh24:mi:ss') dt2 from dual)
## 18,oracle中截取字符串
`substr('ABCDEFG',1,4)`     截取字符串前四个  ABCD

18,case when和聚合函数count、sum的使用

select
t3.region_id as 'regionId',
t3.region_name as 'regionName',
count(case when t1.tricolor = 1 then 1 else null end ) as 'greenTotal',
count(case when t1.tricolor = 2 then 1 else null end ) as 'yellowTotal',
count(case when t1.tricolor = 3 then 1 else null end )as 'redTotal'
from pa_household_member t1
left join pa_household t2 on t2.household_id = t1.household_id
left join system_region t3 on t3.region_id = t2.area
group by t2.area

19,oracle中截取字符串

substr(‘ABCDEFG‘,1,4) 截取字符串前四个 ABCD

20,trunc(sysdate,‘iw‘)

trunc是截尾函数 TRUNC(SYSDATE,‘iw‘)返回该星期中的星期一(本周第二天)

原文地址:https://www.cnblogs.com/fantongxue/p/12443428.html

时间: 2024-10-14 10:39:14

Oracle函数(更新中)的相关文章

Oracle函数-更新中

数值型函数 返回绝对值 abs(x) ABS(X) [功能]返回x的绝对值 [参数]x,数字型表达式 [返回]数字 SQL> select abs(100) , abs(-100) from dual ; ABS(100) ABS(-100) ---------- ---------- 100 100 返回正负值 sign(x) sign(x) [功能]返回x的正负值 [参数]x,数字型表达式 [返回]数字,若为正值返回1,负值返回-1,0返回0 SQL> select sign(100),

oracle函数参数中=&gt;的含义

作者:iamlaosong 今天看到一个MD5加密的问题,很多语言都提供了加密函数,oracle也提供MD5加密函数,网上搜了一下,加密函数是: DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>'abc') 不过,其参数中出现了一个"=>"符号,那么这个符号到底什么意思呢? oracle实参与形参有二种对应方式: 1.一种是位置方式,和面向对象语言参数传递类似: 2.另外一种是=> 作为形参对应,因为位置对应方法有缺限,比如一个

【前端】Util.js-ES6实现的常用100多个javaScript简短函数封装合集(持续更新中)

Util.js (持续更新中...) 项目地址: https://github.com/dragonir/Util.js 项目描述 Util.js 是对常用函数的封装,方便在实际项目中使用,主要内容包含:数组类.浏览器类.日期类.函数类.数学类.媒体类.节点类.对象类.字符串类.类型检测类.正则表达式类等内容. 使用方法 1. 引入Bable transpiler以保证支持ES6 <script type="javascript/text" src="./browser

【函数】Oracle函数系列(1)--字符函数

[函数]Oracle函数系列(1)--字符函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 常见字符函数(lower.upper.initcap.concat.substr.length.intr.lpad.rpad.trim.chr.ascii.replace.translate)的使用 ② 判断字符串中是否含有汉字 ③ substr和instr的联合使用 ④

Oracle函数-高阶篇

下面整理了部分oracle函数-高阶篇: 1. CATSTR    举例:SELECT CATSTR(COLUMN_NAME) NAME_LIST FROM DBA_TAB_COLUMNS WHERE TRIM(TABLE_NAME) = 'T_RZ_DKDATA'  --查询出的结果在一个列中2. INSTR() 检索字符串函数:匹配则返回首次检索的位置的索引值(从1开始),值>0,否则返回值=0    举例:SELECT * FROM USER_TABLES WHERE INSTR(TABL

【文本处理】awk、sed使用 - 更新中

一.正则介绍 基本元字符(基本正则表达式): 字符匹配: .  匹配换行符之外的任意一个字符 [] 字符组元字符,元字符在[]内,会失去特殊意义不用转义 [^] 除开字符组中的字符 次数匹配: *  匹配前面字符零次或多次 \?  零次或一次 \{m,n\}  至少m次,至多n次 \{m,\}   m次 锚定符: \<,\b  词首锚定 \>,\b  词尾锚定 ^    行的开头 $    行的结尾 ^$   空行 .*   任意字符串 分组: \(\)     \1,\2   前向引用,\1

Oracle 批量更新表字段

Oracle 批量更新表字段 CreateTime--2018年2月27日16:02:24 Author:Marydon (一) 将数字替换成汉字 第一步,去重查询 使用distinct关键字先对该字段值进行去重查询,看共有几种情况 --查询指定区间内表停诊字段的值 SELECT DISTINCT T.CLOSE_TZ FROM CONSULT_SCHEDULE T WHERE T.SCHEDULE_DATE BETWEEN TO_DATE('2018-01-01', 'yyyy-MM-dd')

两小时挑战分析力学(更新中)

更新:5 MAY 2016 教材:理论力学(第二版)金尚年.马永利编著,高等教育出版社 开始时间:6:39 PM 第一章 牛顿力学方程 1.1 牛顿与<原理> 经典力学的时空观:绝对时间.绝对空间.绝对运动. 惯性参考系:相对于绝对空间作匀速直线运动的参考系. 牛顿力学定律与伽利略变换 牛顿哲学推理规则:简单性.因果性.统一性.真理性. 1.2 牛顿第二定律在常用坐标系中的表示式 推导所需要的知识: 1. 写出用已知坐标系(如直角坐标系)表示的待求坐标系基矢的矢量表达式 2. 对新基矢求时间导

Hello World!的各种编程语言程序(持续更新中……)

对于很多学习编程语言新手们,可能接触到的第一个程序就是"Hello World"的输出程序,笔者想在此篇简短的博文中介绍关于各种编程语言的"Hello World"输出程序. 至今,笔者仅仅接触过C++和Python两种编程语言,而且都仅仅是新手,所以此次只能写C++和Python两种语言的"Hello World"输出程序,但此篇博文会随着笔者学习的编程语言种类的增多而不断完善. 1. C++语言 #include<iostream>