zoukankan      html  css  js  c++  java
  • DECODE函数简介

    在上一篇bolg中讲到ORACLE优化的时候提到DECODE()函数,以前自己用的也比较少,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈!

    https://www.cnblogs.com/ghzjm/p/9516999.html ORACLE查询优化

    1:使用decode判断字符串是否一样

    主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明);

    使用方法:

    SELECT DECODE(columnname,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

    FROM talbename

    WHERE…

    其中columnname为要选择的table中所定义的column

    含义解释:

    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

    注:其中缺省值可以是你要选择的column name 本身,也可以是你想定义的其他值,比如Other等;

    举例说明:

    现定义一table名为output,其中定义两个column分别为monthid(var型)和sale(number型),若sale值=1000时翻译为D,=2000时翻译为C,=3000时翻译为B,=4000时翻译为A,如是其他值则翻译为Other;

    SQL如下:

    Select monthid , decode (sale,1000,'D',2000,'C',3000,'B',4000,'A',’Other’) sale from output

    特殊情况:

    若只与一个值进行比较

    Select monthid ,decode(sale, NULL,‘---’,sale) sale from output

    另:decode中可使用其他函数,如nvl函数或sign()函数等;

    NVL(EXPR1,EXPR2)

    若EXPR1是NULL,则返回EXPR2,否则返回EXPR1.

    SELECT NAME,NVL(TO_CHAR(COMM),'NOT APPLICATION') FROM TABLE1;

    如果用到decode函数中就是

    select monthid,decode(nvl(sale,6000),6000,'NG','OK') from output 

    sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1,

    如果取较小值就是

    select monthid,decode(sign(sale-6000),-1,sale,6000) from output,即达到取较小值的目的。

      2:使用decode比较大小
    select decode(sign(var1-var2),-1,var 1,var2) from dual
    sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
    sql测试
    select decode(sign(100-90),-1,100,90) from dual
    输出结果
    90
    100-90=10>0 则会返回1,所以decode函数最终取值为90
    反正
    select decode(sign(100-90),1,100,90) from dual
    输出结果
    100
    100-90=10>0返回1,判断结果为1,返回第一个变量100,最终输出结果为100

      3:使用decode函数分段
    工资大于5000为高薪,工资介于3000到5000为中等,工资小于3000为低薪
    sql测试
    SELECT 
        ename,sal,
        DECODE(SIGN(sal - 5000),
                1,
                'high sal',
                0,
                'high sal',
                - 1,
                DECODE(SIGN(sal - 3000),
                        1,
                        'mid sal',
                        0,
                        'mid sal',
                        - 1,
                        DECODE(SIGN(sal - 1000),
                                1,
                                'low sal',
                                0,
                                'low sal',
                                - 1,
                                'low sal')))
    FROM
        emp

    输出结果
    SMITH   800   low sal
    ALLEN 1600 low sal
    WARD 1250 low sal
    JONES 2975 low sal
    MARTIN 1250 low sal
    BLAKE   2850 low sal
    CLARK 2450 low sal
    SCOTT 3000 mid sal
    KING  5000 high sal
    TURNER 1500 low sal
    ADAMS 1100 low sal
    JAMES 950         low sal
    FORD 3000 mid sal
    MILLER 1300 low sal

    4:利用decode实现表或者试图的行列转换

    sql测试
    SELECT 
           SUM(DECODE(ENAME,'SMITH',SAL,0))  SMITH,
           SUM(DECODE(ENAME,'ALLEN',SAL,0))  ALLEN,
           SUM(DECODE(ENAME,'WARD',SAL,0))   WARD,
           SUM(DECODE(ENAME,'JONES',SAL,0))  JONES,
           SUM(DECODE(ENAME,'MARTIN',SAL,0)) MARTIN FROM EMP
    输出结果如下
    SMITH  ALLEN  WARD   JONES  MARTIN
      800  1600   1250       2975       1250

    5:使用decode函数来使用表达式来搜索字符串
    decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)
    decode函数比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。
    sql测试
    SELECT 
        ENAME,
        SAL,
        DECODE(INSTR(ENAME, 'S'),
                0,
                '不含有s',
                '含有s') AS INFO
    FROM
        EMP
    输出结果
    SMITH 800           含有s
    ALLEN 1600   不含有s
    WARD 1250   不含有s
    JONES 2975    含有s
    MARTIN 1250    不含有s
    BLAKE 2850    不含有s
    CLARK 2450    不含有s
    SCOTT 3000   含有s
    KING 5000   不含有s
    TURNER 1500   不含有s
    ADAMS 1100   含有s
    JAMES 950            含有s
    FORD 3000   不含有s
    MILLER 1300   不含有s

    原文取自:

    https://www.cnblogs.com/yw0219/p/5955557.html

    https://blog.csdn.net/weeknd/article/details/71157044

  • 相关阅读:
    代理模式和策略模式的区别
    代理模式vs适配器模式vs外观模式 转
    装饰模式与代理模式的区别(转载)
    用Delphi实现动态代理(2):设计说明  转
    Java静态内部类的介绍
    非常好的Java反射例子
    Java多线程中的锁机制
    Java多线程共享数据、同步、通信
    Java程序运行超时后退出解决
    Java安全:运用加密技术保护Java源代码
  • 原文地址:https://www.cnblogs.com/ghzjm/p/9517127.html
Copyright © 2011-2022 走看看