前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >postgresql 如何处理空值NULL 与 替换的问题

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

作者头像
AustinDatabases
发布2023-09-06 10:45:41
1.6K0
发布2023-09-06 10:45:41
举报
文章被收录于专栏:AustinDatabases

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

1 默认值取代NULL

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

3 数据转换和类型的转换

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

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

代码语言:javascript
复制
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;

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

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

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

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

我们在建立这样一个表

代码语言:javascript
复制
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');



select first_name || '.' || last_name, coalesce(box1,box2,box3) as guess_what,date_time from guess_what;a 那么这样的情况下,如果不使用coalesce 函数有什么办法来进行操作吗? 我们再来看

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,而是展示的 时候,为我们想用其他的文字来代替它。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档