oracle比较decode(case when) 、4种去重---和去重中的统计函数
Oracle关于去重的就几个方法

Oracle关于去重的就⼏个⽅法刚刚在⽹上看到了⼀些同仁写的关于Oracle去重的sql语句看着不错于是就把拌匀⼀下让⼤家关注⼀下操作步骤⼀、重复记录根据单个字段来判断1、⾸先,查找表中多余的重复记录,重复记录是根据单个字段(FIELD_CODE)来判断select * from table where FIELD_CODE in(select FIELD_CODE from table group by FIELD_CODE having count(FIELD_CODE) >1)2、删除表中多余的重复记录,重复记录是根据单个字段(FIELD_CODE)来判断,只留有rowid最⼩的记录delete from table where (FIELD_CODE) in (select FIELD_CODE from table group by FIELD_CODE having count(FIELD_CODE) >1) and rowid not in (select min(rowid) from table group by FIELD_CODE having count(*)>1)⼆、重复记录根据多个字段来判断1、查找表中多余的重复记录(多个字段)select * from table a where (a.FIELD_CODE,a.DTA_ITEM_NAME) in(select FIELD_CODE,DTA_ITEM_NAME from table group by FIELD_CODE,DTA_ITEM_NAME having count(*) > 1)2、删除表中多余的重复记录(多个字段),只留有rowid最⼩的记录delete from table a where (a.FIELD_CODE,a.DTA_ITEM_NAME) in (select FIELD_CODE,DTA_ITEM_NAME from table group by FIELD_CODE,DTA_ITEM_NAME having count(*) > 1) and rowid not in (select min(rowid) from table group byFIELD_CODE,DTA_ITEM_NAME having count(*)>1)3、查找表中多余的重复记录(多个字段),不包含rowid最⼩的记录select * from table a where (a.FIELD_CODE,a.DTA_ITEM_NAME) in (select FIELD_CODE,DTA_ITEM_NAME from table group by FIELD_CODE,DTA_ITEM_NAME having count(*) > 1) and rowid not in (select min(rowid) from table group byFIELD_CODE,DTA_ITEM_NAME having count(*)>1)。
OracleSql关于case-when,if-then,decode

OracleSql关于case-when,if-then,decode 今天在采集58-⼆⼿市场数据时,遇到⼀个问题:⽹页的样式不够规范导致采到的数据奇形怪状,具体的数据表如下:这种数据不利于观察,也⽆法⽤于分析。
我是⽤case-when来进⾏初步的清洗。
(substr中的startindex和endindex需要⾃⼰数~)selectcase when t.condition like'<!-- 成⾊ -->%'thensubstr(t.condition, 20, length(t.condition) -26) whent.condition like'成⾊:%'thensubstr(t.condition, 12, length(t.condition) -18) else'\N'END CONDITION,t.classification2,CASE WHEN T.RELEASE_DATE LIKE'<li class="time" title="发布⽇期">%'thensubstr(t.release_date,31,length(t.release_date)-35) whent.release_date like'<li class="time">%'thensubstr(t.release_date,18,length(t.release_date)-22) whent.release_date like'更新时间%'thensubstr(t.release_date,6,length(t.release_date))else'\N'END release_date,case when t.price like'<span%>'thensubstr(t.price,27,length(t.price)-34) whent.price like'%<'thensubstr(t.price,27,length(t.price)-36)||SUBSTR(T.PRICE,LENGTH(T.PRICE)-2,LENGTH(T.PRICE)) WHENT.PRICE LIKE'价格:%'THENSUBSTR(T.PRICE,26,LENGTH(T.PRICE)-35) ELSE'\N'END PRICE,CASE WHEN T.SELLERNAME LIKE'linkman%'''thensubstr(t.sellername,10,length(t.sellername)-10) whenT.SELLERNAME LIKE'linkman%>'thensubstr(t.sellername,10,length(t.sellername)-185) else'\N'end sellernamefrom TABLENAME t这样得到的数据就⽐较规范了:由此,可以总结下case-when的语法:CASE WHEN condition1THEN sentence1WHEN condition2THEN sentence2...ELSEsentenceNEND除此之外,还可以使⽤if-then-elif-else。
ORACLE多条件的统计查询(casewhen)

ORACLE多条件的统计查询(casewhen)前⼏天要做⼀个统计查询的功能,因为涉及多张表,多种条件的统计分析。
⼀开始便想到了UNION和IF语句,然后写了1000多⾏代码,就为了查30条数据觉得不应该。
然后就开始百度,多种条件下的统计。
然后有⼀种语法让我眼前⼀亮,case when then else end当满⾜CASE设定的条件时,就可以执⾏then语句。
由于我要做的分组查询统计,是要罗列每⼀种情况,⽽且根据输⼊的“管理员编号”不同返回不同结果,结果记录的条数和每⼀种情况是可知的,这个语法完全可⽤核⼼代码如下:SELECT SUBSTR(A.业务,1,2) ⾏政区域,SUBSTR(A.业务,3,LENGTH(A.业务)-2) 业务模块,A.已结案,A.办理中,A.案件总数,ROUND(A.已结案 /decode(A.案件总数, 0, 9999,A.案件总数), 4) * 100 || '%' 完成率FROM(SELECT '市级律师服务' 业务,1 排序,SUM(CASE WHEN 区县代码 IS NULL AND (TRUNC(委托时间, 'DD') BETWEEN V_SJQ AND V_SJZ) AND 申请状态代码 IN('ztdm1','ztdm2') THEN 1 ELSE 0 END) 已结案,SUM(CASE WHEN 区县代码 IS NULL AND (TRUNC(委托时间, 'DD') BETWEEN V_SJQ AND V_SJZ) AND 申请状态代码 NOT IN('ztdm1','ztdm2') THEN 1 ELSE 0 END) 办理中,SUM(CASE WHEN 区县代码 IS NULL AND (TRUNC(委托时间, 'DD') BETWEEN V_SJQ AND V_SJZ) AND 申请状态代码 IS NOT NULL THEN 1 ELSE 0 END) 案件总数FROM TA_律师申请委托)AWHERE A.排序 IN(V_排序1,V_排序2,V_排序3,V_排序4,V_排序5)ORDER BY A.排序;通过排序号,来控制不同管理员查询的数据范围不同:V_排序1 INTEGER;V_排序2 INTEGER;V_排序3 INTEGER;V_排序4 INTEGER;V_排序5 INTEGER;-----------------------------SELECTDECODE(P_管理员编号,'test1',2,'test2',3,'test3',4,'test4',5) INTO V_排序1 FROM DUAL;V_排序2:=V_排序1+6;V_排序3:=V_排序1+12;V_排序4:=V_排序1+18;V_排序5:=V_排序1+24;⽬前测试数据量不⼤,优化前后性能差别不明显,但是代码⾏数减少了3倍以上,可读性明显增强,少了很多IF判断,理论上复杂度减少很多。
casewhen和decode的比较分析

casewhen和decode的⽐较分析⼀、case when与 if - else 类似,语句如下:CASE expr WHEN expr1 THEN return_expr1[WHEN expr2 THEN return_expr2...WHEN exprn THEN return_exprnELSE else_expr]END且有两种判断⽅法,case 字段 when 值 then return 值else return 值 end例如:select bname , price, case when price > =10 and price <20 then 'price1'when price > =20 and price <30 then 'price2'when price >= 30 and price <40 then 'price3'when price > =40 and price <50 then 'price4'when price >= 50 and price <60 then 'price5'else 'price6' end "价格段"from book;⼆、 decode (Oracle数据库独有)DECODE(col|expression, search1, result1[, search2, result2,...,]...[, searchn, resultn,...,][, default])也可以和 sign函数⼀起使⽤也可以:decode(字段,判断条件,返回值1,返回值2)select decode(sign(arg1-arg2),-1, arg1, arg2) from dual;注:sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1select price,decode(price,'32.5','活着','其他' ) 书名 from book;三、⽐较 1.DECODE 是Oracle特有的; 2.CASE WHEN 是Oracle, SQL Server,MySQL 都可⽤; 3.DECODE 只能⽤做相等判断,但是可以配合sign函数进⾏⼤于,⼩于,等于的判断;CASE可⽤于=,>=,<,<=,<>,is null,is not null 等的判断;4.DECODE 使⽤其来⽐较简洁,CASE 虽然复杂但更为灵活。
OracleCASEWHEN用法介绍

OracleCASEWHEN⽤法介绍1. CASE WHEN 表达式有两种形式--简单Case函数CASE sexWHEN'1'THEN'男'WHEN'2'THEN'⼥'ELSE'其他'END--Case搜索函数CASEWHEN sex ='1'THEN'男'WHEN sex ='2'THEN'⼥'ELSE'其他'END2. CASE WHEN 在语句中不同位置的⽤法2.1 SELECT CASE WHEN ⽤法SELECT grade, COUNT (CASE WHEN sex =1THEN1/*sex 1为男⽣,2位⼥⽣*/ELSE NULLEND) 男⽣数,COUNT (CASE WHEN sex =2THEN1ELSE NULLEND) ⼥⽣数FROM students GROUP BY grade;2.3 WHERE CASE WHEN ⽤法SELECT T2.*, T1.*FROM T1, T2WHERE (CASE WHEN PARE_TYPE ='A'ANDT1.SOME_TYPE LIKE'NOTHING%'THEN1WHEN PARE_TYPE !='A'ANDT1.SOME_TYPE NOT LIKE'NOTHING%'THEN1ELSE0END) =12.4 GROUP BY CASE WHEN ⽤法SELECTCASE WHEN salary <=500THEN'1'WHEN salary >500AND salary <=600THEN'2'WHEN salary >600AND salary <=800THEN'3'WHEN salary >800AND salary <=1000THEN'4'ELSE NULL END salary_class, -- 别名命名COUNT(*)FROM Table_AGROUP BYCASE WHEN salary <=500THEN'1'WHEN salary >500AND salary <=600THEN'2'WHEN salary >600AND salary <=800THEN'3'WHEN salary >800AND salary <=1000THEN'4'ELSE NULL END;3.关于IF-THEN-ELSE的其他实现3.1 DECODE() 函数select decode(sex, 'M', 'Male', 'F', 'Female', 'Unknown')from employees;貌似只有Oracle提供该函数,⽽且不⽀持ANSI SQL,语法上也没CASE WHEN清晰,个⼈不推荐使⽤。
oracle条件判断函数

oracle条件判断函数在Oracle数据库中,条件判断函数是一种功能强大的工具,用于根据给定的条件返回不同的结果。
这些函数可以在SELECT语句中使用,以便根据特定的条件执行不同的操作。
以下是一些常用的Oracle条件判断函数:1. CASE函数:CASE函数是一种灵活的条件判断函数,它可以根据多个条件返回不同的值。
语法如下:```sqlCASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE resultEND```这个函数首先根据条件1判断,如果满足条件1,则返回结果1;如果不满足,则继续判断条件2,满足条件2则返回结果2,以此类推。
如果所有条件都不满足,则返回ELSE语句后的结果。
2. DECODE函数:DECODE函数用于比较一个表达式与一系列值,并返回与表达式匹配的值。
语法如下:```sqlDECODE(expr, value1, result1, value2, result2, ..., default_result)```这个函数首先将表达式与value1进行比较,如果相等,则返回result1,否则继续与value2比较,依此类推。
如果没有与表达式匹配的值,则返回default_result。
3. NULLIF函数:NULLIF函数用于比较两个表达式,并在它们相等时返回NULL,否则返回第一个表达式的值。
语法如下:```sqlNULLIF(expr1, expr2)```这个函数首先比较expr1和expr2,如果它们相等,则返回NULL,否则返回expr1的值。
这些条件判断函数在查询中非常有用,可以根据不同的条件进行灵活的数据操作和结果返回。
在实际应用中,根据具体需求选择合适的条件判断函数,可以提高查询的效率和灵活性。
case和decode的区别

case和decode的区别区别:decode是pl/sql语法,只能在oracle中使⽤,case when是标准SQL的语法,哪⼉都能⽤,也就是说移植性更强.decode像是case when的精简版,当要实现的功能⽐较简单时,⽤decode⽅便,简洁.decode只能做等值的,case when可以做区间的,使⽤范围来进⾏条件区分,decode能做到的,case when也能做到;效率⽅⾯,个⼈觉得两者效率差不多;但decode的语法要简单些,但它只能做等值的⽐较;case when end 能做条件的判断。
Oracle中的CASE When:SELECT LogID,UserID,LogTime,Url,Description,( casewhen OperateType = 0 then '新增' when OperateType=1 then '修改' else '删除' end ) OperationNameFROM LOGOracle中的Decode():·含义解释: decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)SELECT LogID,UserID,LogTime,Url,Description, decode(OperateType,0,'新增',1,'修改','删除') OperationName FROM LOG区别:⼆者在固定⽐较条件时使⽤差不多,如OperateType和固定的值0,1,2等作⽐较。
但是如果当⽐较条件不固定时,如OperateType 变成Sarlary时候,对区间0-2000,2000-5000,5000以上,显然case when会容易很多。
其实,decode和case when很多时候是可以等效的,选⽤那个,完全可以由程序员⾃⼰的习惯和熟练程度来决定。
表的转置行转列:DECODE(Oracle)和CASEWHEN的异同点

的异同点表的转置⾏转列:DECODE(Oracle)和CASEWHEN的异同点异同点都可以对表⾏转列;DECODE功能上和简单Case函数⽐较类似,不能像Case搜索函数⼀样,进⾏更复杂的判断在Case函数中,可以使⽤BETWEEN, LIKE, IS NULL, IN, EXISTS等等(也可以使⽤NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。
)DECODE⽅法 (Oracle公司独家)decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)--该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ......ELSIF 条件=值n THEN RETURN(翻译值n)ELSE RETURN(缺省值)END IF--⾏转列SELECT name,SUM(DECODE(Subject, '数学', Score, 0)) 数学,SUM(DECODE(Subject, '语⽂', Score, 0)) 语⽂,SUM(DECODE(Subject, '英语', Score, 0)) 英语FROM ScoresGROUP BY nameCASE WHENSELECT name,SUM( CASE WHEN Subject='数学' THEN Score ELSE 0 END) 数学,SUM( CASE WHEN Subject='语⽂' THEN Score ELSE 0 END) 语⽂,SUM( CASE WHEN Subject='英语' THEN Score ELSE 0 END) 英语FROM Scores group by name;Case函数只返回第⼀个符合条件的值,剩下的Case部分将会被⾃动忽略,Else部分的默认值是NULLCase具有两种格式,简单Case函数的写法相对⽐较简洁,但是和Case搜索函数相⽐,功能⽅⾯会有些限制,⽐如写判断式在Case函数中,可以使⽤BETWEEN, LIKE, IS NULL, IN, EXISTS等等(也可以使⽤NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oracle比较decode/case when 、4种去重和去重中的统计函数一:decode 和case whendecode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default) decode函数比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。
select username,decode(lock_date,null,'unlocked','locked') status from t;----------------如果lock_date是null就返回unlocked 如果不是null就返回lockedselect username,decode(lock_date,null,'unlocked') status from t;----------------如果lock_date是null就返回unlocked 否则是空(因为没有定义)例如有个学生表...... 行转列-------create table score2(name varchar2(10),Language number(3),Math number(3),English number(3));insert into score2 values('Zhang',80,67,95);insert into score2 values('Li',79,84,62);insert into score2(name,Language) values('Chen',88);commit;Select * from score2; 显示成报表的格式.......select name,sum(decode(subject,'Language', grade,0)) "Language",sum(decode(subject,'Math', grade,0)) "Math",sum(decode(subject,'English', grade,0)) "English"from scoregroup by name;NAME Language Math English-------------------- ---------- ---------- ----------Zhang 80 92 76Wang 73 0 0Li 81 95 50第二列,如果subject='Language',那么就显示成绩,否则显示为0第三列,如果subject='Math',那么就显示成绩,否则显示为0第四列,如果subject='English',那么就显示成绩,否则显示为0Case whenCase [selector] ---selector可以不设置When id=1 THEN ‘id是1’;ELSE ‘没有id值’;END CASE; ---->如果ID=1 就显示id是1 否则显示没有id值~~~~~上面用case when显示.................select ,sum( casewhen t.subject = 'Language' then t.gradeelse 0end ) dd,sum( casewhen t.subject = 'Math' then t.gradeelse 0end ) Math,sum( casewhen t.subject = 'English' then t.gradeelse 0end ) Englishfrom score t group by ;二:去重的4中方法create table test (c1 int ,c2 varchar2(10));insert into test values (1,'Smith');insert into test values (1,'Smith');insert into test values (2,'John');insert into test values(1,'Jack');insert into test values (2,'Jack');insert into test values (2,'John');insert into test values (2,'John');commit;一种方法:distinct 把之前的表去重显示并创建,drop table old_table;create table tmp_test as select distinct * from test1; ---创建临时表drop table test1;alter table tmp_test rename to test1;第二种rowiddelete from testwhere rowid <> ( select min(rowid)from test bwhere b.c1 = test.c1and b.c2 = test.c2 )第三种方法:分组,rowiddelete from test t where t.rowid not in (select min(rowid) from test group by c1,c2 ); commit;Rowid为伪列是物理地址OOOOOO: 数据库对象号FFF: 表空间相关的数据文件号(相对文件号)BBBBBB: 数据块号RRR: 在块中的行号第四种方法,分析函数dense_rank()drop table test;create table test (c1 int ,c2 varchar2(10));insert into test values (1,'Smith');insert into test values (1,'Smith');insert into test values (2,'John');insert into test values(1,'Jack');insert into test values (2,'Jack');insert into test values (2,'John');insert into test values (2,'John');commit;select c1,c2,rowid rd,row_number() over(partition by c1,c2 order by c1) rn from test;不重复的只有1重复的就会出现2,3,4第一次出现,不重复的时候,rn为1相同的记录,重复出现,第二次,就记录为2第三次,3怎么找不出重复的行select b.c1,b.c2 from宣城在线:/(select c1,c2,rowid rd,row_number() over(partition by c1,c2 order by c1) rn from test) bwhere b.rn = 1;不等于号用了不走索引效率很低分页row_number要求emp表中的5-10的记录?select * from(select a.*,row_number() over(order by empno desc) rk from emp a) whererk<=10 and rk>=5;select rn,empno,ename from (select rownum rn,empno,ename from emp) where rn>=5 and rn<=10;select *from (select deptno,ename,sal,dense_rank() over(partition by deptno order by sal desc) rkfrom emp)where rk<=3; --->发现部门为20的scott 和ford都是3k,所以并列第一有2.3名select *from (select deptno,ename,sal,rank() over(partition by deptno order by sal desc) rk from emp )where rk<=3; --->发现部门为20的scott 和ford都是3k,所以并列第一没2有3名Partition by == group by分析函数里用的是partition by普通函数用的是group byselect *from(select deptno,ename,sal,row_number() over(partition by deptno order by sal desc) rnfrom emp)where rn<=3; --->发现部门为20的scott 和ford按照默认显示出现1和2 名次那么看下这些区别:select *from(select deptno,ename,sal,row_number() over(partition by deptno order by sal desc) rn, rank() over(partition by deptno order by sal desc) rk,dense_rank() over(partition by deptno order by sal desc) drk from emp) where drk<=3;/blog/1546668Oracle统计函数。