zoukankan      html  css  js  c++  java
  • 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 函数,放在其他数据库里就不好使了~

    完。

  • 相关阅读:
    Oracle(00):PL/SQL嵌入SQL语句
    Oracle(00):CASE WHEN 用法
    Oracle(00):正则表达式
    Oracle(00):删除重复记录
    Oracle(00):PL/SQL块与表达式
    Oracle(00):PL/SQL复合类型
    Oracle(00):PL/SQL数据类型
    Oracle(00):rownum行号
    Oracle(00):递归查询connect by
    Oracle(00):Update语句
  • 原文地址:https://www.cnblogs.com/MasterE/p/6606409.html
Copyright © 2011-2022 走看看