MySQL decode()的等同实现

在Oracle中使用decode方法可以轻松实现代码和值之间的转换,但是在MySQL中该如何实现类似功能呢?
    MySQL中没有直接的方法可以使用,但是我们可以通过下面两种方法来实现:

  1、case when

Select title,case Emergency when 1 then '紧急'  else '普通' End  as  emergency   from already_sign
SELECT id,(CASE id 
			  WHEN 1 THEN '小李'
              WHEN 2 THEN '小名'
              ELSE '别人'
              END) AS title
FROM stdscore

definer如何使用 mysql mysql中decode用法_MySQL

definer如何使用 mysql mysql中decode用法_字段_02

   2、if

select a.title,if(a.Emergency=1,'紧急','普通')emergency from already_sign a

Oracle 中 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
decode(字段或字段的运算,值1,值2,值3)

       这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3。当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多

1、比较大小

select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。

2、此函数用在SQL语句中,功能介绍如下:

Decode函数与一系列嵌套的 IF-THEN-ELSE语句相似。base_exp与compare1,compare2等等依次进行比较。如果base_exp和 第i 个compare项匹配,就返回第i 个对应的value 。如果base_exp与任何的compare值都不匹配,则返回default。每个compare值顺次求值,如果发现一个匹配,则剩下的compare值(如果还有的话)就都不再求值。一个为NULL的base_exp被认为和NULL compare值等价。如果需要的话,每一个compare值都被转换成和第一个compare 值相同的数据类型,这个数据类型也是返回值的类型。

Decode函数在实际开发中非常的有用

结合Lpad函数,如何使主键的值自动加1并在前面补0

select LPAD(decode(count(记录编号),0,1,max(to_number(记录编号)+1)),14,'0') 记录编号 from tetdmis

 

select decode(dir,1,0,1) from a1_interval
dir 的值是1变为0,是0则变为1

比如我要查询某班男生和女生的数量分别是多少?
通常我们这么写:

select count(*) from 表 where 性别 = 男;
select count(*) from 表 where 性别 = 女;
要想显示到一起还要union一下,太麻烦了
用decode呢,只需要一句话
select decode(性别,男,1,0),decode(性别,女,1,0) from 表
SELECT sum(
				(CASE SEX 
				WHEN '0' THEN 1
				ELSE 0
				END) 
        )男生,
        sum(
              (CASE SEX 
				WHEN '0' THEN 0
				ELSE 1
				END)
       ) 女生
FROM stdscore

definer如何使用 mysql mysql中decode用法_字段_03

definer如何使用 mysql mysql中decode用法_MySQL_04

select count(*)  from stdscore where SEX ='0'
UNION ALL
select count(*)  from stdscore where SEX ='1'

 

definer如何使用 mysql mysql中decode用法_字段_05

如果给男女数量加上别名 

select count(*) as '男' from stdscore where SEX ='0'
UNION ALL
select count(*) as '女' from stdscore where SEX ='1'

definer如何使用 mysql mysql中decode用法_字段_06

如果使用的是union

definer如何使用 mysql mysql中decode用法_数据类型_07

3,order by对字符列进行特定的排序

大家还可以在Order by中使用Decode。

例:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。
 

select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, , '外语',3)

4、使用decode函数分段

工资大于5000为高薪,工资介于3000到5000为中等,工资小于3000为低薪

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

5、利用decode实现表或者试图的行列转换

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

6、使用decode函数来使用表达式来搜索字符串

 

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