postgresql 如何处理空值NULL 与 替换的问题

9e7f0118058c4609396d5e159a2a3cce.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信liuaustin3 ,(共1140人左右 1 + 2 + 3)新人会进入3群

最近一直在研究关于POSTGRESQL 开发方面的一些技巧和问题,本期是关于在开发中的一些关于NULL 值处理的问题。在业务开发中,经常会遇到输入的值为NULL 但是实际上我们需要代入默认值的问题,而通常的处理方法是,在字段加入默认值设置,让不输入的情况下,替换NULL值,同时还具备另一个字段类型转换的功能。

1 默认值取代NULL

2 处理程序可选字段的值为空的情况

3 数据转换和类型的转换

下面我们看看如何进行实际中的相关事例

事例1  程序中在需要两个字段进行计算后,得出结果进行展示,比如买一送一,或买一送二 等,我们先创建一个表

c3dc2c910d224ee5d750bfdc6a389ea1.png

CREATE TABLE IF NOT EXISTS public.disaccount
(
    id serial NOT NULL,
    store_id smallint NOT NULL,
    first_name character varying(45) COLLATE pg_catalog."default" NOT NULL,
    last_name character varying(45) COLLATE pg_catalog."default" NOT NULL,
    sell_number smallint NOT NULL,
    sell_discount float,
    sell_update timestamp without time zone DEFAULT now(),
    CONSTRAINT pkey_id PRIMARY KEY (id)) TABLESPACE pg_default;

d5812b68e518dc81a5419af67f984257.png

在上图中,我们可以看到由于打折的数字是没有的,而在查询中导致由于部分商品在购买中没有打折,而导致最后付款的实际钱数为0。在这样的情况下,那么在这样的情况下,我们可以使用POSTGRESQL 提供的函数来解决这个问题。

c18c442177160cb2217625b6ef59e072.png

这里采用了coalesce 函数,在 sell_discount 为NULL的情况下,则我们用1来替代这个值,保证最终计算的逻辑结果是正确的。

实际上,如果在设计表的时候,给这个字段的默认值为1 ,也可以解决这个问题,但是如果早期未做处理,上线后数据量较大,也可以用coalesce 来解决这个问题,并且使用这个函数是灵活的,后面NULL 可以替代的值也是你可以随意指定的。

问题2 在一个程序逻辑中,有三个字段,但是其中只能有一个字段可以被展示,其他的字段的值为NULL,比如一个猜盒子里面有什么的程序,盒子里面有什么是一个已经预定好的情况,并且在开奖的时候,需要给出到底那个盒子里面有奖品。

我们在建立这样一个表

c809ab397688f57228e35d08bd78c9ff.png

 
 
drop table guess_what;
create table  guess_what (id serial primary key,
                          first_name varchar(20),
                          last_name varchar(20),
                          box1 varchar(10),
                          box2 varchar(10),
                          box3 varchar(10),
                          date_time timestamp without time zone DEFAULT now());

insert into guess_what (first_name,last_name,box2) values ('Simon','Almbo','box2');
insert into guess_what (first_name,last_name,box3) values ('Lisa','Slmeb','box3');

5c7aa54be9f5d1fc434e86f8266efd9a.png

select first_name || '.' || last_name, coalesce(box1,box2,box3) as guess_what,date_time
from guess_what;a

那么这样的情况下,如果不使用coalesce 函数有什么办法来进行操作吗?

我们再来看

78b8b3307a36e6d32659c6dff6b42fe5.png

select first_name || '.' || last_name, 
case 
when box1 is not null then box1
when box2 is not null then box2
when box3 is not null then box3
end as guess_what,
date_time
from guess_what;
a

那么除了上面的两种使用的情况,COALESCE 还可以针对某些字段的类型进行转换,如日期类型转换为文字的需求。

如我们在日期里面是NULL 的情况下,我们不想展示为NULL,而是展示的

时候,为我们想用其他的文字来代替它。

255a2472f68b5b57cf4285ef0ca4ad7d.png

select id,
COALESCE(CAST(date_time AS TEXT), 'date_time') AS date_time
from guess_what;
a

上面的例子就是我们在针对date_time 字段时间类型的数据在他是NULL的情况下,展示出来我们指定的其他类型的文字,相关的写法如上。COALESCE可以与其他条件逻辑(如CASE)结合使用,这基于特定条件或标准对NULL值进行更复杂的处理。通过利用COALESCE的灵活性并将其与条件逻辑相结合,您可以实现更复杂的数据转换和替换。

6520e78104e45591d0eddad21a4d237a.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值