Oracle在Logstash需求中碰到的问题处理方式

Oracle对空值(NULL)的5种处理

  • 在公司Logstash相关需求中,为了方便sql语句更加简洁,所以需要使用到Oracle中的视图,在视图创建过程中,遇到有关对Null值的处理,这里做一个整理,方便日后查询

COALESCE函数

  • COALESCE(expr1,expr2,expr3,…)函数接受一个输入参数的列表,返回第1个非空的参数。如果所有的参数都为空,则返回空值。
    • 判断expr1参数是否为空,不为空返回expr1,否则判断expr2参数是否为空,不为空返回expr2,否则判断expr3参数是否为空,不为空返回expr3…

NULLIF函数

  • NULLIF(expr1,expr2)函数接受两个输入参数,如果第1个参数等于第2个参数,返回空值;否则,返回第1个参数的值

CASE表达式

--查询部门ID为2的部门员工全年收入(包括工资和奖金)
SELECT t.emp_name,
  t.salary AS "工资",
  t.bonus AS "奖金",
  CASE WHEN t.bonus IS NULL THEN t.salary*12 
       ELSE  t.salary*12 + t.bonus 
  END AS "全年收入"    
FROM employee t WHERE t.dept_id=2;

NVL(expr1,expr2)函数

  • NVL(expr1,expr2)函数返回第1个非空的参数值,等价于只有两个参数的COALESCE函数

NVL2(expr1,expr2,expr3)函数

  • NVL2(expr1,expr2,expr3)函数包含3个参数,如果第1个参数不为空,返回第2个参数的值;否则,返回第3个参数的值。

Oracle拼接

使用||

  • Oracle 拼接两个字段,并且中间使用 特殊字符进行拼接
 select 字段1|| '-' || 字段2 AS '字段名' FROM 表名

使用wm_concat

Oracle wm_concat()函数 - 浅雨凉 - 博客园 (cnblogs.com)

oracle中使用wm_concat函数的方法及弊端(解决办法)_阿呆观月的博客-CSDN博客

Oracle的decode函数

用法

用法一

decode(条件,1,返回值1,2,返回值2,…值n,返回值n,缺省值)

解释:条件满足值1,则返回值1,满足值2,则返回值2,以此类推

用法二

decode(字段或字段的运算,值1,值2,值3)

解释:这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3

应用举例

  • 翻译值
--Oracle
select t.id,
       t.name,
       t.age,
       decode(t.sex, '1', '男生', '2', '女生', '其他') as sex
  from STUDENT2 t
  
--MySql
select t.id,
	   t.name,
	   t.age,
	   if(t.sex ='1','男生',
         if(t.sex='2','女生','其他')) as sex
from STUDENT2 t
  • 比较大小
--Oracle
select t.id,
       t.name,
       t.age,
       decode(sign(t.age - 20),
              1,
              '20以上',
              -1,
              '20以下',
              0,
              '正好20',
              '未知') as sex
  from STUDENT2 t
  
 --MySql
select t.id,
       t.name,
       t.age,
       if(t.age-20>0,'20以上',(
				 if(t.age-20<0,'20以下',
        	if(t.age-20=0,'正好20','未知')))) as sex
  from STUDENT2 t
  • 搜索字符串
--Oracle
select t.id,
       decode(instr(t.name, '三'), 0, '姓名不含有三', '姓名含有三') as name,
       t.age,
       t.sex
  from STUDENT2 t

--MySql
select t.id,
       if(instr(t.name, '三')=0,'姓名不含有三', '姓名含有三') as name,
       t.age,
       t.sex
  from STUDENT2 t
  • decode分段
select name,
       sal,
       decode(sign(sal - 5000),
              1,
              '高薪',
              0,
              '高薪',
              -1,
              decode(sign(sal - 3000), 1, '中等', 0, '中等', -1, '低薪')) as salname
  from person;

  • 判断是否为空
select t.id,
       t.name,
       t.age,
       decode(t.sex,NULL,'暂无数据',t.sex) as sex
  from STUDENT2 t

实际应用

||和nvl2结合使用

在这里插入图片描述

结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wgX6KZG-1669089272073)(C:\Users\Ausware01\AppData\Roaming\Typora\typora-user-images\image-20221122113317783.png)]

||和nvl和decode结合使用

在这里插入图片描述

结构图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值