首页 > 其他分享 >PG在转换null值时,需要注意 CASE WHEN与 COALESCE 的区别

PG在转换null值时,需要注意 CASE WHEN与 COALESCE 的区别

时间:2023-07-03 10:34:38浏览次数:49  
标签:值时 CASE test3 cc WHEN ---------- select

目录

适用范围

any

方案概述

在把ORACLE迁移到PG过程中,我们经常需要转换ORACLE的 DECODE,但是如果将更DECODE(C,NULL,0, C) 进行转换的话,我们可以选择用 CASE WHEN 或 COALESCE 两种方案 ;
但如果是DECODE(C,NULL,0) 进行转换的话,我们就只能选持CASE WHEN 。

实施步骤

在ORACLE 测试如下

#创建模拟数据
 create table test3( a int,b int , c int );
 insert into test3(a,b,c) values(1,1,1);
 insert into test3(a,b) values(2,2);
 insert into test3(a ) values(3);

#原始结果如下:
SQL>   select a,b,c from test3 ; 

         A          B          C
---------- ---------- ----------
         1          1          1
         2          2
         3

#将C例为空的行值替换为0,C例非空行仍为原值 
SQL>   select a,b,DECODE(c, NULL, 0,c) cc  from  test3 ;

         A          B         CC
---------- ---------- ----------
         1          1          1
         2          2          0
         3                     0
#将C例为空的行值替换为0,但原本C例非空的值却变成了空值 
SQL>   select a,b,DECODE(c, NULL, 0) cc  from  test3 ;       

         A          B         CC
---------- ---------- ----------
         1          1
         2          2          0
         3                     0

在Postgresql 测试如下

#创建模拟数据
 create table test3( a int,b int , c int );
 insert into test3(a,b,c) values(1,1,1);
 insert into test3(a,b) values(2,2);
 insert into test3(a ) values(3);

#原始结果如下:
postgres=#   select a,b,c from test3 ; 
 a | b | c 
---+---+---
 1 | 1 | 1
 2 | 2 |  
 3 |   |  
(3 rows)


#通过CASE WHEN 转换,将C例为空的行值替换为0,C例非空行仍为原值 

postgres=#  select  a,b, CASE WHEN c is null  THEN 0  else c END  as cc  from     test3 ;
 select  a,b, coalesce(c, 0) cc   from     test3 ;
 a | b | cc 
---+---+----
 1 | 1 |  1
 2 | 2 |  0
 3 |   |  0
(3 rows)

#通过CASE WHEN 转换,将C例为空的行值替换为0,但原本C例非空的值却变成了空值 
postgres=#  select  a,b, CASE  WHEN c is null  THEN 0  END  as cc  from     test3 ;
 a | b | cc 
---+---+----
 1 | 1 |   
 2 | 2 |  0
 3 |   |  0
(3 rows)

#通过COALESCE ,转换,将C例为空的行值替换为0,C例非空行仍为原值 
postgres=#  select  a,b, coalesce(c, 0) cc   from     test3 ;
 a | b | cc 
---+---+----
 1 | 1 |  1
 2 | 2 |  0
 3 |   |  0
(3 rows)

总结

  1. coalesce(c, 0) cc 等价于 CASE WHEN c is null THEN 0 else c END as cc (有else判断)
  2. coalesce(c, 0) cc 等价于 ORACLE 中的 有第4个参数 DECODE(c, NULL, 0,c)
  3. 而ORACLE 中的只有3个参数 DECODE(c, NULL, 0) 在PG中只能通过 CASE WHEN c is null THEN 0 END as cc 来转换(没有else判断)

参考文档

https://www.postgresql.org/docs/15/functions-conditional.html#FUNCTIONS-CASE
https://www.postgresql.org/docs/15/functions-conditional.html#FUNCTIONS-COALESCE-NVL-IFNULL

标签:值时,CASE,test3,cc,WHEN,----------,select
From: https://www.cnblogs.com/cqdba/p/17522120.html

相关文章

  • 【845】R语言case_when函数
    参考:case_when:AgeneralvectorisedifOthers用TRUE表示,举例如下:x<-1:50case_when(x%%35==0~"fizzbuzz",x%%5==0~"fizz",x%%7==0~"buzz",TRUE~as.character(x)) ......
  • 网络安全学习篇37_第二阶段_基本Linux脚本、变量、判断if、循环for\while、case语句
    上一篇博客:网络安全学习篇36_第二阶段_简单介绍JavaWeb框架之Tomcat服务、Nginx负载均衡、Linux包过滤防火墙IPtables、NAT网络地址转换目录shell脚本变量数值读入if判断语句for、while循环语句case语句开始shell脚本1.脚本的作用:可以执行计划任务把需要执行的代码保存在一个文件......
  • 状态机编程实例-嵌套switch-case法
    嵌入式软件开发中,状态机编程是一个比较实用的代码实现方式,特别适用于事件驱动的系统。本篇,以一个炸弹拆除的小游戏为例,介绍状态机编程的思路。C/C++语言实现状态机编程的方式有很多,本篇先来介绍最简单最容易理解的switch-case方法。1状态机实例介绍1.1炸弹拆除游戏如下是一个自制......
  • Linux扩展篇-shell编程(五)-流程控制(二)-case语句
    基本语法:case"${item}"in1)echo"item=1";;2|3)echo"item=2oritem=3";;*)echo"default(noneofabove)";;esac注意事项:以case开始esac结尾case行尾必须为单词“in”,每......
  • mockito5.4.0单元测试(11) --do when家族的方法们:doReturn()|doThrow()| doAnswer()|
    mockito官方文档地址:https://www.javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#do_family_methods_stubs//mock一个对象HashMapmockMap=mock(HashMap.class);  doCallRealMethod方法示例://当mock对象调用put和size方法时,都调用真实的方......
  • 关于.net4.0使用WhenAny实现Task超时机制
    .net4.0想要使用await/async语法糖必须要引用:Microsoft.BclMicrosoft.Bcl.Async Microsoft.Bcl.Build可以从nuget引用此三个包publicstaticasyncTask<TResult>TryRunWithTimeoutAsync<TResult>(thisFunc<TResult>function,intdueTime){//......
  • 锁(case篇)
    case1(表锁的读-写-读阻塞)上篇文档中提到过WRITElocksnormallyhavehigherprioritythanREADlockstoensurethatupdatesareprocessedassoonaspossible.ThismeansthatifonesessionobtainsaREADlockandthenanothersessionrequestsaWRITElock,su......
  • C#异步方法中Task.WhenAll的使用
    一、说明Task.WhenAll()、Task.WhenAny()这两个与Task.WaitALL()、Task.WaitAny()是有区别的,When是异步的,Wait是同步的。Task.WhenAll():所有task完成时,task才完成,用于等待多个任务执行结束。Task.WhenAny():任何一个task完成时,task完成。二、示例:usingSystem;usingSystem.IO......
  • Android-Kotlin-When&类型推断
    Kotlin的when表达式TextEngine描述文字处理对象:packagecn.kotlin.kotlin_base02/***描述文字处理对象**valtextContent传入进来的文字内容val是常量*/classTextEngine(valtextContent:String){/***处理文字,然后返回*返回完整的字符串......
  • 费报只是小 case!电子影像系统,工作效率up无限
    在日常工作中,我发现许多朋友对电子影像系统存有一个错误认知,“电子影像系统,我了解,就是用来做费用报销的吧”。但事实上,电子影像系统的实用价值远非这样,它可以解决企业许多业务场景中的难点。今天,让我们一起来探讨电子影像系统,希望能对大家在企业数字化改革中带来更多帮助......