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的情况。
decode 在oracle的用法
文章标题:深度解析Oracle中的DECODE函数的用法一、引言在Oracle数据库中,DECODE函数是一种非常有用的函数,它可以根据指定的条件对一个字段的值进行转换或筛选。
在实际的数据库操作中,DECODE函数经常被用来实现数据的逻辑转换和条件筛选,从而为我们提供了非常方便的数据处理能力。
在本篇文章中,我将从深度和广度的角度对Oracle中DECODE函数的用法进行综合评估,并提供详尽的解析和案例分析。
二、DECODE函数的基本用法和语法结构DECODE函数是Oracle提供的一种条件转换函数,其基本语法结构如下:```sqlDECODE(expr, search1, result1, search2, result2, …, searchN, resultN, default)```其中,expr表示待比较的表达式,search1、search2、…、searchN 表示待比较的条件值,result1、result2、…、resultN表示每个条件值对应的结果值,default表示如果expr与所有条件值都不匹配时的默认值。
DECODE函数的作用是,当expr与search1匹配时返回result1,与search2匹配时返回result2,依此类推,如果都不匹配则返回default值。
三、DECODE函数的深度解析和高级应用1. DECODE函数的多重转换用法DECODE函数不仅可以进行单一条件的转换,还可以进行多重条件的转换,这为我们在数据库操作中提供了更多的灵活性和功能。
我们可以使用DECODE函数对不同的条件值进行多重转换,从而实现更为复杂的数据处理。
2. DECODE函数的条件筛选和逻辑转换除了简单的数值或字符转换外,DECODE函数还可以被用来进行条件筛选和逻辑转换。
我们可以利用DECODE函数在数据库查询中实现复杂的条件筛选,从而快速地获取我们需要的数据结果。
3. DECODE函数在实际案例中的应用为了更好地理解DECODE函数的用法,我们可以结合实际的案例进行分析和演示。
oracle 中decode的用法
oracle 中decode的用法Oracle中的DECODE函数用于将一个表达式与一系列条件进行比较,并返回第一个满足条件的结果。
DECODE函数的基本语法如下:DECODE(表达式, 比较值1, 结果1, 比较值2, 结果2, ..., 默认结果)其中,表达式是要进行比较的值;比较值和结果是成对出现的,表示要与表达式进行比较和返回的结果;默认结果是可选的,表示当没有与表达式匹配的比较值时,返回的值。
DECODE函数的工作原理如下:- 首先,它将表达式与第一个比较值进行比较。
- 如果相等,则返回对应的结果。
- 如果不相等,则继续比较下一个比较值,直到找到匹配的比较值或遍历完所有比较值。
- 如果没有找到匹配的比较值,则返回默认结果(如果指定了默认结果)。
以下是DECODE函数的一些示例用法:1. 将性别编码转换为文字:sqlSELECT name, DECODE(gender, 'M', 'Male', 'F', 'Female', 'Unknown') AS gender_textFROM employees;2. 根据评分范围将成绩等级化:sqlSELECT name, score, DECODE(score, 90, 'A', 80, 'B', 70, 'C', 'D') AS grade FROM students;3. 根据日期判断是否为周末:sqlSELECT order_date, DECODE(TO_CHAR(order_date, 'D'), 1, 'Sunday', 7, 'Saturday', 'Weekday') AS day_typeFROM orders;注意事项:- DECODE函数只能处理等于(=)条件的比较,如果需要处理其他条件,可以使用CASE表达式。
ORAcle DECODE和CASE的性能比较
DECODE和CASE的性能比较Oracle的DECODE函数功能很强,灵活运用的话可以避免多次扫描,从而提高查询的性能。
而CASE是9i以后提供的语法,这个语法更加的灵活,提供了IF THEN ELSE的功能。
对于很多情况,DECODE和CASE都能解决问题,个人更倾向于使用DECODE,一方面是从8i保留下来的习惯,另一方面是DECODE的语法更加的简洁,代码量要小一些。
不过今天在看Oracle9i的数据仓库手册时发现,Oracle在文档中提到CASE 语句的效率会更高一些,尤其是CASE表达式WHEN常量THEN的语法,效率要比CASE WHEN表达式THEN的语法更高一些。
对于后面这种说法倒是没有太多的疑问,对于CASE比DECODE效率高这种说法倒是第一次看到,印象中DECODE效率很高,应该不会比CASE的效率差。
到底效率如何,还是要具体的实例来说:SQL> CREATE TABLE T AS2 SELECT A.*3 FROM DBA_OBJECTS A, DBA_MVIEWS;Table created.SQL> SELECT COUNT(*) FROM T;COUNT(*)----------6075760下面检查DECODE和两种CASE语句的效率:SQL> SET ARRAY 1000SQL> SET TIMING ONSQL> SET AUTOT TRACESQL> SELECT DECODE(OWNER, 'SYSTEM', 'SYSTEM', 'SYS', 'SYSTEM', 'USER')2 FROM T;6075760 rows selected.Elapsed: 00:00:07.24Execution Plan----------------------------------------------------------Plan hash value: 1601196873-------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4245K| 68M| 13828 (1)| 00:03:14 | | 1 | TABLE ACCESS FULL| T | 4245K| 68M| 13828 (1)| 00:03:14 | -------------------------------------------------------------------------- Note------ dynamic sampling used for this statementStatistics----------------------------------------------------------0 recursive calls0 db block gets47551 consistent gets0 physical reads0 redo size46288564 bytes sent via SQL*Net to client67317 bytes received via SQL*Net from client6077 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)6075760 rows processedSQL> SELECT CASE OWNER WHEN 'SYSTEM' THEN 'SYSTEM'2 WHEN 'SYS' THEN 'SYSTEM'3 ELSE 'USER' END4 FROM T;6075760 rows selected.Elapsed: 00:00:07.22Execution Plan----------------------------------------------------------Plan hash value: 1601196873-------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4245K| 68M| 13828 (1)| 00:03:14 | | 1 | TABLE ACCESS FULL| T | 4245K| 68M| 13828 (1)| 00:03:14 | -------------------------------------------------------------------------- Note------ dynamic sampling used for this statementStatistics----------------------------------------------------------0 recursive calls0 db block gets47551 consistent gets0 physical reads0 redo size46288578 bytes sent via SQL*Net to client67317 bytes received via SQL*Net from client6077 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)6075760 rows processedSQL> SELECT CASE WHEN WNER = 'SYSTEM' THEN 'SYSTEM'2 WHEN WNER = 'SYS' THEN 'SYSTEM'3 ELSE 'USER' END4 FROM T;6075760 rows selected.Elapsed: 00:00:07.23Execution Plan----------------------------------------------------------Plan hash value: 1601196873-------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4245K| 68M| 13828 (1)| 00:03:14 | | 1 | TABLE ACCESS FULL| T | 4245K| 68M| 13828 (1)| 00:03:14 | -------------------------------------------------------------------------- Note------ dynamic sampling used for this statementStatistics----------------------------------------------------------0 recursive calls0 db block gets47551 consistent gets0 physical reads0 redo size46288585 bytes sent via SQL*Net to client67317 bytes received via SQL*Net from client6077 SQL*Net roundtrips to/from client0 sorts (memory)6075760 rows processed测试结果确实是CASE的简单表达式写法效率最高,然后是CASE的另一种写法,DECODE效率最低。
oracle去除重复数据的方法
oracle去除重复数据的⽅法⽐如现在有⼀⼈员表(表名:peosons)若想将姓名、⾝份证号、住址这三个字段完全相同的记录查询出来代码如下:select p1.*from persons p1,persons p2where p1.id<>p2.idand p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address可以实现上述效果.⼏个删除重复记录的SQL语句1.⽤rowid⽅法2.⽤group by⽅法3.⽤distinct⽅法1。
⽤rowid⽅法据据oracle带的rowid属性,进⾏判断,是否存在重复,语句如下:查数据:代码如下:select * from table1 a where rowid !=(select max(rowid)from table1 b where 1=1 and 2=2......)删数据:代码如下:delete from table1 a where rowid !=(select max(rowid)from table1 b where 1=1 and 2=2......)2.group by⽅法查数据:代码如下:select count(num), max(name) from student --列出重复的记录数,并列出他的name属性group by numhaving count(num) >1 --按num分组后找出表中num列重复,即出现次数⼤于⼀次删数据:代码如下:delete from studentgroup by numhaving count(num) >1这样的话就把所有重复的都删除了。
3.⽤distinct⽅法 -对于⼩的表⽐较有⽤代码如下:create table table_new as select distinct * from table1 minuxtruncate table table1;insert into table1 select * from table_new;查询及删除重复记录的⽅法⼤全1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断代码如下:select * from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最⼩的记录代码如下:delete from peoplewhere peopleId in (select peopleId from people group by peopleIdhaving count(peopleId) > 1)and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)3、查找表中多余的重复记录(多个字段)代码如下select * from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)4、删除表中多余的重复记录(多个字段),只留有rowid最⼩的记录代码如下:delete from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)5、查找表中多余的重复记录(多个字段),不包含rowid最⼩的记录代码如下:select * from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)(⼆)⽐⽅说在A表中存在⼀个字段“name”,⽽且不同记录之间的“name”值有可能会相同,现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;代码如下:Select Name,Count(*) From A Group By Name Having Count(*) > 1如果还查性别也相同⼤则如下:代码如下:Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1(三)⽅法⼀代码如下:declare @max integer,@id integerdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1open cur_rowsfetch cur_rows into @id,@maxwhile @@fetch_status=0beginselect @max = @max -1set rowcount @maxdelete from 表名 where 主字段 = @idfetch cur_rows into @id,@maxendclose cur_rowsset rowcount 0⽅法⼆"重复记录"有两个意义上的重复记录,⼀是完全重复的记录,也即所有字段均重复的记录,⼆是部分关键字段重复的记录,⽐如Name字段重复,⽽其他字段不⼀定重复或都重复可以忽略。
Oracle用decode函数或CASE-WHEN实现自定义排序
Oracle⽤decode函数或CASE-WHEN实现⾃定义排序1 问题对SQL排序,只要在order by后⾯加字段就可以了,可以通过加desc或asc来选择降序或升序。
但排序规则是默认的,数字、时间、字符串等都有⾃⼰默认的排序规则。
有时候需要按⾃⼰的想法来排序,⽽不是按字段默认排序规则。
⽐如字段值为英⽂字段:Monday、Tuesday、Wednesday等,如果按字段默认排序规则就为:FridayMondaySaturdaySundayThursdayTuesdayWednesday实际我需要的是:MondayTuesdayWednesdayThursdayFridaySaturdaySunday2 decode函数通过decode函数可以实现,如下:select * from table_dateorder bydecode(DateStr,'Monday',1'Tuesday',2'Wednesday',3'Thursday',4'Friday',5'Saturday',6'Sunday',7,0);后⾯的数字可以不连续。
3 case when语句另外,还可以⽤case when来实现:select * from table_dateorder by (CASE DateStrWHEN 'Monday' then 1WHEN 'Tuesday' then 2WHEN 'Wednesday' then 3WHEN 'Thursday' then 4WHEN 'Friday' then 5WHEN 'Saturday' then 6WHEN 'Sunday' then 7ELSE 0END);4 总结当然,把字段直接赋值为对应的数字效率会⾼很多,通过另外⼀张表再建⽴映射关系。
oracle比较decode(case when) 、4种去重---和去重中的统计函数
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统计函数。
oracle中有关case和decode的用法
«博客园首页sql与oracle中有关case和decode的用法(行转列)及比较作者:NerverQuit来源:博客园发布时间:2010-10-13 16:24 阅读:982 次原文链接[收藏]引:为了举例说明,这里创建了一张成绩表,如下图所示:比较:1、sql中,这两个函数我们仅能使用case,代码及结果如下:select name,case Subjectwhen '语文' then 1when '数学' then 2when '英语' then 3 --else 3end as '科目代码'from Results同样的,我们可以用case实现行转列,代码及结果如下:select Name,sum(case when Subject='语文' then Result end) '语文',sum(case when Subject='数学' then Result end) '数学',sum(case when Subject='英语' then Result end) '英语'from Resultsgroup by Name2、但是,在oracle中,这两个函数我们都可以使用,代码及结果如下:decode用法:select Name,decode(Subject,'语文',1,'数学',2,'英语',3) 科目代码from results;select Name,decode(Subject,'语文',1,'数学',2,3) 科目代码 from Results;case用法:select name,casewhen Subject='语文' then 1when Subject='数学' then 2when Subject='英语' then 3 --else 3end as 科目代码from Results;这两种方法均能达到同样的结果:同样的,我们可以使用这两个函数实现行转列,代码及结果如下:decode:selectName,sum(decode(Subject,'语文',Result,0)) 语文,sum(decode(Subject,'数学',Result,0)) 数学,sum(decode(Subject,'英语',Result,0)) 英语from Resultsgroup by Name;case:selectName,sum((case when Subject='语文' then Result else 0 end)) 语文,sum((case when Subject='数学' then Result else 0 end)) 数学,sum((case when Subject='英语' then Result else 0 end)) 英语from Resultsgroup by Name;数据库表与行转列的中间结果(想想还是也附上)oracle中:selectName,decode(Subject,'语文',Result,0) 语文,decode(Subject,'数学',Result,0) 数学,decode(Subject,'英语',Result,0) 英语from Results;或selectName,(case when Subject='语文' then Result else 0 end) 语文,(case when Subject='数学' then Result else 0 end) 数学,(case when Subject='英语' then Result else 0 end) 英语from Results;结果如下:以上内容,不对的地方请指正。
oracle数据库decode函数用法
oracle数据库decode函数用法Oracle数据库是当今业界广泛使用的关系型数据库管理系统。
在Oracle数据库中,DECODE是一个非常重要且常用的条件表达式函数。
DECODE函数可以根据多个条件进行判断并返回结果。
DECODE函数用于在两个或多个表达式之间进行条件判断,如果条件成立,就返回一个相应的值。
本文将详细介绍Oracle数据库中DECODE函数的用法,包括语法、参数、示例等。
一、DECODE函数的语法DECODE函数的语法如下:DECODE(expr, search1, result1 [,search2,result2,...] [,default])各个参数的含义如下:- expr:需要进行条件判断的表达式;- search1:与expr进行比较的表达式1;- result1:当expr等于search1时返回的值;- search2:与expr进行比较的表达式2;- result2:当expr等于search2时返回的值;- default:如果expr不等于search1或search2,就返回default的值。
二、DECODE函数的参数1. exprDECODE函数的第一个参数为需要进行条件判断的表达式。
该参数可以是任何基础数据类型,如字符串、数字、日期等。
2. search1, result1, search2, result2DECODE函数的第二个参数及其之后的两个参数为一组“搜索值”和“返回值”。
DECODE函数会按照顺序依次比较这些搜索值,当表达式expr等于某个搜索值时,DECODE 函数就会返回其对应的返回值。
需要注意的是,DECODE函数的搜索值和返回值的数据类型必须一致,否则会发生隐式类型转换错误。
3. defaultDECODE函数的最后一个参数为缺省值。
如果表达式expr不等于search1和search2,DECODE函数就会返回这个缺省值。
decode在oracle的用法
decode在oracle的用法(原创实用版)目录1.Oracle 中的 decode 函数概念2.decode 函数的参数列表与返回值3.decode 函数的应用示例4.decode 函数在实际场景中的使用正文一、Oracle 中的 decode 函数概念Oracle 数据库中的 decode 函数是一种功能强大的函数,它可以将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。
函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。
当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。
二、decode 函数的参数列表与返回值decode 函数的参数列表由两部分组成:比较值和返回值。
比较值是用于与输入数值进行比较的值,而返回值是当输入数值与比较值匹配时返回的结果。
函数的参数列表可以包含多个序偶,以满足不同条件的需求。
当输入数值与所有比较值都不匹配时,函数将返回默认值。
三、decode 函数的应用示例以下是一个 decode 函数的应用示例,假设我们想给智星职员加工资,其标准是:工资在 8000 元以下的将加 20%;工资在 8000 元以上的加15%。
我们可以使用 decode 函数如下:```sqlSELECT id, decode(salary, 8000, 1.2, 0.15) as bonus FROMemployee;```在这个示例中,我们使用 decode 函数比较员工表中的工资字段salary 与 8000 元的大小。
如果 salary 小于 8000 元,则返回 1.2(即加 20% 的工资);如果 salary 大于等于 8000 元,则返回 0.15(即加15% 的工资)。
四、decode 函数在实际场景中的使用decode 函数在实际场景中的使用非常灵活,可以应用于各种业务场景。
例如,我们可以使用 decode 函数来根据员工的职位、绩效等因素计算奖金;还可以使用 decode 函数来根据订单的状态返回不同的提示信息等。
Oracle消除重复记录的几种方式
Oracle消除重复记录的⼏种⽅式消除重复数据是数据清洗的头等⼤事,下⾯介绍⽐较常⽤的⼏种去重⽅式。
Distinct删除重复的员⼯信息select distinct(empno) from empRowid利⽤rowid结合max和min函数快速去重select e.* from emp e where e.rowid = (select max(e.rowid) from emp e利⽤rowid结合max和min函数快速删除重复数据delete e.* from emp e where e.rowid < (select max(e.rowid) from emp eGroup byselect deptno from emp group by deptno;Row_number()row_number是通过标记排号⽅式去重,如果有2条或以上的重复数据,直接筛选删除即可。
1.查看重复数据select d.id,d.outer_code from dict_depts_source d order by outer_code2.标识重复数据select d.id,d.outer_code,row_number() over(partition by outer_code order by outer_code) row_flag from dict_depts_source d3.删除重复数据delete from dict_depts_source where id in(select id from(select d.id,d.outer_code,row_number() over(partition by outer_code order by outer_code) row_flag from dict_depts_source d)t where t.row_flag > 1)4.检查删除效果select d.id,d.outer_code,row_number() over(partition by outer_code order by outer_code) row_flag from dict_depts_source d。
oracle decode函数 doris相同用法-概述说明以及解释
oracle decode函数doris相同用法-概述说明以及解释1.引言1.1 概述:在数据库开发中,Oracle Decode函数是一种非常常用的函数,它主要用于实现条件判断和数据转换的功能。
通过Decode函数,我们可以方便地根据指定的条件对数据进行处理,适用于各种复杂的情况。
与此类似,Doris也提供了类似的功能,可以帮助开发者更加灵活地处理数据。
本文将重点介绍Oracle Decode函数的用法,并对比Doris中与之相同的用法。
通过对两者的比较分析,我们可以更加深入地了解它们各自的特点和应用场景。
最后,本文也将展望未来这些函数在数据库开发中的发展趋势,希望能为读者带来一些启发和帮助。
1.2 文章结构:本文将首先介绍Oracle Decode函数的定义、用法以及示例,帮助读者深入了解该函数的功能和作用。
接着将结合实际案例,解释Doris相同用法,让读者更直观地理解如何在Doris中使用类似的函数。
最后,将比较Oracle Decode函数和Doris用法的差异,分析它们在实际应用中的优劣势,并提出一些应用建议。
通过本文的阐述,读者将能够全面了解Oracle Decode函数和Doris用法,为实际工作提供参考和借鉴。
1.3 目的:本文旨在探讨Oracle数据库中常用的Decode函数以及其在Doris 数据库中的相似用法。
通过比较这两种数据库中Decode函数的功能和用法,我们旨在帮助读者更好地理解和运用这一功能,提高他们在数据处理和分析中的效率和准确性。
同时,希望通过本文的研究和分析,对于数据库开发者和数据分析师们有所启发,为他们在实际工作中遇到的问题提供解决思路和方法。
最终目的是促进数据库技术的交流和发展,推动数据处理领域的进步。
2.正文2.1 介绍Oracle Decode函数Oracle的Decode函数是一种用于条件判断和数据转换的函数。
它的基本语法如下:DECODE(expression, search1, result1, search2, result2, ..., default)其中,expression是需要进行条件判断的表达式,search1、search2等是用于比较的值,result1、result2等是对应的返回值。
oracle中decode用法
oracle中decode用法Oracle是一种强大的关系数据库管理系统,在Oracle数据库中,DECODE函数是一个非常重要的函数,它允许我们根据条件来进行一些特定的操作。
本文将重点介绍Oracle中DECODE的使用方法,具体步骤如下:1.首先,我们需要明确DECODE函数的作用和用法。
它可以将一个值与多个可能的结果进行比较,并返回相应的结果,类似于if-else 语句。
2.在Oracle中,DECODE函数的基本语法如下:DECODE (expr, search1, result1, search2, result2, ..., default)其中,expr是要比较的表达式,它可以是任何类型的值;search1、search2等是要比较的值;result1、result2等是对应的结果;default是可选的,表示如果没有搜索到匹配的值,就返回默认的结果。
3.使用DECODE函数的一个示例是将一个数值型的字段值进行分类。
例如,我们可以根据商品销售数量来分类商品为“热销”、“畅销”、“一般”和“滞销”。
代码示例如下:SELECT product_name, DECODE (sales_count, 0, '滞销', 1, '一般', 2, '畅销', 3, '热销', '未知') AS sales_level FROM products;在这个例子中,我们用DECODE函数将销售数量进行比较,并将对应的结果返回为不同的文本值。
4.除了可以返回文本值以外,DECODE函数也可以返回数值类型的值。
例如,可以根据某个条件返回不同的折扣率。
代码示例如下:SELECT product_name, list_price, DECODE (promo_code,'SPRING', list_price * 0.8, 'SUMMER', list_price * 0.9,list_price) AS discounted_price FROM products;在这个例子中,我们用DECODE函数根据不同的促销代码返回不同的折扣率,从而计算出商品的折扣价格。
- 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统计函数。