Oracle Sql关于case-when,if-then,decode

  今天在采集58-二手市场数据时,遇到一个问题:网页的样式不够规范导致采到的数据奇形怪状,具体的数据表如下:

这种数据不利于观察,也无法用于分析。我是用case-when来进行初步的清洗。(substr中的startindex和endindex需要自己数~)

select
       case when t.condition like ‘<!-- 成色 -->%‘ then
         substr(t.condition, 20, length(t.condition) - 26) when
         t.condition like ‘成 色:%‘ then
         substr(t.condition, 12, length(t.condition) - 18) else ‘\N‘ END CONDITION,
         t.classification2,
       CASE WHEN T.RELEASE_DATE LIKE ‘<li class="time" title="发布日期">%‘ then
          substr(t.release_date,31,length(t.release_date)-35) when
          t.release_date like ‘<li class="time">%‘ then
          substr(t.release_date,18,length(t.release_date)-22) when
          t.release_date like ‘更新时间%‘ then
          substr(t.release_date,6,length(t.release_date))else ‘\N‘ END release_date,
       case when t.price like ‘<span%>‘ then
          substr(t.price,27,length(t.price)-34) when
          t.price like ‘%<‘ then
          substr(t.price,27,length(t.price)-36)||SUBSTR(T.PRICE,LENGTH(T.PRICE)-2,LENGTH(T.PRICE)) WHEN
          T.PRICE LIKE ‘价 格:%‘ THEN
          SUBSTR(T.PRICE,26,LENGTH(T.PRICE)-35) ELSE ‘\N‘ END PRICE,
       CASE WHEN T.SELLERNAME LIKE ‘linkman%‘‘‘ then
          substr(t.sellername,10,length(t.sellername)-10) when
          T.SELLERNAME LIKE ‘linkman%>‘ then
          substr(t.sellername,10,length(t.sellername)-185) else ‘\N‘ end sellername
  from TABLENAME t

这样得到的数据就比较规范了:

由此,可以总结下case-when的语法:

CASE WHEN condition1
THEN sentence1
WHEN condition2
THEN sentence2
...
ELSE
sentenceN
END

除此之外,还可以使用if-then-elif-else。

我一开始以为decode在这里不适用,因为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

而我需要“条件 like 值”。

后来查阅资料发现:可以decode结合instr函数来实现“条件like 值”:

instr(str1,str2),意即如果str1中包含str2,返回str2在str1中的位置,否则返回0。

不过不推荐此种方法,因为只有Oracle中有decode 函数,放在其他数据库里就不好使了~

完。

时间: 2024-11-20 14:12:56

Oracle Sql关于case-when,if-then,decode的相关文章

Oracle特有函数 case when decode exists 分页rownum

select * from EMP eselect * from dept dselect * from salgrade s--Oracle特有函数 case whenselect case 2 when 1 then '一' when 2 then '二' when 3 then '三' else '其他' end from dual;--Oracle特有函数 decodeselect decode(3,1,'一',2,'二',3,'三','其他')from dual;--查询员工的领导信息

oracle sql语句

##########基本操作##########启动数据库:su - oraclesqlplus / as sysdbaSQL> startup 对scott用户解锁:SQL> conn / as sysdbaSQL> alter user scott identified by tiger account unlock; 连接到指定的数据库用户:SQL> conn scott/tiger 实现操作系统开机数据库自动open:vi /etc/oratab--------------

《精通Oracle SQL(第2版) 》

<精通Oracle SQL(第2版) > 基本信息 作者: (美)Karen Morton    Kerry Osborne    Robyn Sands    Riyaj ShamsudeenJared Still 译者: 朱浩波 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115351661 上架时间:2014-5-5 出版日期:2014 年5月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 数据库 > Oracle 更多关于>&g

Oracle SQL tuning 步骤

Oracle SQL tuning 步骤 SQL是的全称是Structured Query Language(结构化查询语言).SQL是一个在80年代中期被使用的工业标准数据库查询语言.不要把SQL语言与商业化产品如Microsoft SQL server或开源产品MySQL相混淆.所有的使用SQL缩略词的这些都是SQL标准的一部分. 一.SQL tuning之前的调整    下面这个粗略的方法能够节省数千小时乏味的SQL tuning,因为一旦调整它将影响数以百计的SQL查询.记住,你必须优先

Oracle SQL性能优化

转载自:http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection ta

Oracle SQL语言之常用函数_超越OCP精通Oracle视频教程培训30

Oracle SQL语言之常用函数_超越OCP精通Oracle视频教程培训30 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第5/5套:Oracle SQL语言之常用函数.主要学习Oracle数据库SQL聚合函数,分组函数,字符函数,转换函数,日期字符数字转换,日期函数,集合函数,分析函数等. Oracle SQL语言之常用函数,课程内容详细如下: 聚合函数-数据统计 分组函数-使用group by与havin

Oracle order by case when 多条件排序

ORACLE sql 排序 根据两个条件排序,根据id号由小到大排序,同时country字段是北京的排最前面前面,其次上海,..大连,最后是其他城市,怎么写? 写法如下:select * from proviceorder by (case when country='北京' then 0 when country='上海' then 1 when country='广东' then 2 when country='深圳' then 3 when country='杭州' then 4 when

oracle sql优化

第一掌 避免对列的操作 任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数.计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数. 例1:下列SQL条件语句中的列都建有恰当的索引,但30万行数据情况下执行速度却非常慢: select * from record where  substrb(CardNo,1,4)='5378'(13秒) select * from record where  amount/30< 1000(11秒) select * from recor

&lt;转&gt;Oracle SQL性能优化

原文链接:http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection t