zoukankan      html  css  js  c++  java
  • 几个常见函数的非常见用法

    转载地址:http://blog.itpub.net/12932950/viewspace-662628/

    1、instr
    instr函数用于定位指定字符串某次出现的位置。
    通常情况,都是根据顺向查找,即从左向右查找,比如有字符串:1,2,3,4,5,6
    现在要查找第3个","出现的位置,则可以:
    select instr('1,2,3,4,5,6',',',1,3) from dual;

    但是如果要查找最后一个","出现的位置,而且个数又不确定,按照上面的思路就无法简单的实现了
    于是就有了反向查找这个用法:
    select instr('1,2,3,4,5,6',',',-1) from dual;
    这个-1便指明了定位的方向是从右向左查找。

    2、translate(src, rep_str, to_str)
    这个函数用于替换src中存在rep_str的字符按顺序替换为to_str中的字符。
    比如要将上个例子中的字符串中的替换为"a,b,c,d,e,f",则可以:
    select translate('1,2,3,4,5,6', '1234567890', 'abcdefghij') from dual

    但是,如果要将字符串中的123456等数字去掉而保留",",该如何做呢。
    于是translate函数的特殊用法出现了:
    select translate('1,2,3,4,5,6', '^1234567890', '^') from dual 
    可以在rep_str中指定一个在src中未出现的字符,然后替换目标to_str为该字符即可去掉这些数字。

    还有一种用法也很是值得一提:
    假如我有三组数字,每组数字都是由1-9中的三个数字组成,且这三组数字之间没有一个数字是重复的。比如:
    123   456    789
    就是没有重复的。但是:
    123   345    567
    就是有重复的。那如何实现这样的无重复的三组数字呢?
    这里translate就有可以派上用场了:
    select translate('123456789', '$' || n1 || n2 || n3, '$') from dual;
    只要判断上述结果是否为空即可。
    原理其实和前面一个例子相同,只不过这里用法上反过来了,思路实在是妙啊。

    3、reverse(str)
    将字符串的顺序反转。如:
    select reverse('1,2,3,4,5,6') from dual;

    4、dump
    这个命令可以得到所输入的数据的类型、长度及16进制转换后的值。
    当dump(str, 1010)时,可以得到这个字符串的字符集。

    5、extract
    截取时间的某个部分。
    比如天:extract(day from current_timestamp)

    6、to_dsinterval
    interval时间段的函数转换,格式为:dd hh24:mi:ss
    如:select sysdate + to_dsinterval('0 0:0:30') from dual
    表示加30秒。

    7、numtodsinterval/numtoyminterval
    这里的ds和ym的意思分别是day to second和year to month。理解了这个含义,那么函数的功能和差别也就自然而然的明白了。

    他们和第六个函数的作用相似。不过功能上更加丰富和灵活一点。
    比如说,当前时间+1天:
    sysdate + numtodsinterval(1, 'day')
    当前时间+23秒:
    sysdate + numtodsinterval(23,'second')
    而且可以动态增长:
    select sysdate + numtodsinterval(rownum, 'second') 
      from dual connect by rownum <= 10

    这个用法比直接的Interval灵活多了,直接的interval不能实现动态的增加。
    可以这么做:
    select sysdate + interval '23' second 
      from dual connect by rownum <= 10
    但是不能这么做:
    SQL> select sysdate + interval to_char(rownum) second
      2    from dual connect by rownum <= 10
      3  /
     
    select sysdate + interval to_char(rownum) second
      from dual connect by rownum <= 10
     
    ORA-00923: 未找到要求的 FROM 关键字
    无法实现动态递增。

  • 相关阅读:
    char 型变量中能不能存贮一个中文汉字,为什么?
    抽象类(abstract class)和接口(interface)有什么异同?
    描述一下JVM加载class文件的原理机制?
    重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
    String和StringBuilder、StringBuffer的区别?
    此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
    是否可以继承String类?
    两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
    laraval join 的理解
    whereHasIn方法
  • 原文地址:https://www.cnblogs.com/violin508/p/4362926.html
Copyright © 2011-2022 走看看