最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

postgresql處理空值NULL與替換的問題解決辦法

 更新時間:2024年02月06日 10:57:14   作者:Austindatabases  
由于在不同的語言中對空值的處理方式不同,因此常常會對空值產(chǎn)生一些混淆,下面這篇文章主要給大家介紹了關(guān)于postgresql處理空值NULL與替換的問題解決辦法,需要的朋友可以參考下

開頭還是介紹一下群,如果感興趣polardb ,mongodb ,mysql ,postgresql ,redis 等有問題,有需求都可以加群群內(nèi)有各大數(shù)據(jù)庫行業(yè)大咖,CTO,可以解決你的問題。加群請加微信liuaustin3 ,(共1140人左右 1 + 2 + 3)新人會進(jìn)入3群

最近一直在研究關(guān)于POSTGRESQL 開發(fā)方面的一些技巧和問題,本期是關(guān)于在開發(fā)中的一些關(guān)于NULL 值處理的問題。在業(yè)務(wù)開發(fā)中,經(jīng)常會遇到輸入的值為NULL 但是實際上我們需要代入默認(rèn)值的問題,而通常的處理方法是,在字段加入默認(rèn)值設(shè)置,讓不輸入的情況下,替換NULL值,同時還具備另一個字段類型轉(zhuǎn)換的功能。

1 默認(rèn)值取代NULL

2 處理程序可選字段的值為空的情況

3 數(shù)據(jù)轉(zhuǎn)換和類型的轉(zhuǎn)換

下面我們看看如何進(jìn)行實際中的相關(guān)事例

事例1  程序中在需要兩個字段進(jìn)行計算后,得出結(jié)果進(jìn)行展示,比如買一送一,或買一送二 等,我們先創(chuàng)建一個表

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;

在上圖中,我們可以看到由于打折的數(shù)字是沒有的,而在查詢中導(dǎo)致由于部分商品在購買中沒有打折,而導(dǎo)致最后付款的實際錢數(shù)為0。在這樣的情況下,那么在這樣的情況下,我們可以使用POSTGRESQL 提供的函數(shù)來解決這個問題。

這里采用了coalesce 函數(shù),在 sell_discount 為NULL的情況下,則我們用1來替代這個值,保證最終計算的邏輯結(jié)果是正確的。

實際上,如果在設(shè)計表的時候,給這個字段的默認(rèn)值為1 ,也可以解決這個問題,但是如果早期未做處理,上線后數(shù)據(jù)量較大,也可以用coalesce 來解決這個問題,并且使用這個函數(shù)是靈活的,后面NULL 可以替代的值也是你可以隨意指定的。

問題2 在一個程序邏輯中,有三個字段,但是其中只能有一個字段可以被展示,其他的字段的值為NULL,比如一個猜盒子里面有什么的程序,盒子里面有什么是一個已經(jīng)預(yù)定好的情況,并且在開獎的時候,需要給出到底那個盒子里面有獎品。

我們在建立這樣一個表

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 函數(shù)有什么辦法來進(jìn)行操作嗎?

我們再來看

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 還可以針對某些字段的類型進(jìn)行轉(zhuǎn)換,如日期類型轉(zhuǎn)換為文字的需求。

如我們在日期里面是NULL 的情況下,我們不想展示為NULL,而是展示的

時候,為我們想用其他的文字來代替它。

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

a

上面的例子就是我們在針對date_time 字段時間類型的數(shù)據(jù)在他是NULL的情況下,展示出來我們指定的其他類型的文字,相關(guān)的寫法如上。COALESCE可以與其他條件邏輯(如CASE)結(jié)合使用,這基于特定條件或標(biāo)準(zhǔn)對NULL值進(jìn)行更復(fù)雜的處理。通過利用COALESCE的靈活性并將其與條件邏輯相結(jié)合,您可以實現(xiàn)更復(fù)雜的數(shù)據(jù)轉(zhuǎn)換和替換。

附:PG的空值相加如何實現(xiàn)

PostgreSQL數(shù)據(jù)庫中,對于NULL值相加的處理:任何數(shù)值和NULL相加都得NULL。

postgres=# create table t3(id1 int,id2 int);
CREATE TABLE
postgres=# insert into t3 select 1,2;
INSERT 0 1
postgres=# insert into t3 select 1,NULL;
INSERT 0 1
postgres=# insert into t3 select NULL,NULL;
INSERT 0 1
postgres=# insert into t3 select NULL,3;
INSERT 0 1
postgres=# select *from t3;
 id1 | id2
-----+-----
   1 |   2
   1 |
     |
     |   3
(4 行記錄)

看下加的結(jié)果:

postgres=# select id1+id2 from t3;
 ?column?
----------
        3


(4 行記錄)

可以看到只要有一個參數(shù)是NULL,那么加的結(jié)果就是NULL。那么這個計算是如何實現(xiàn)的呢?

從前文可以了解到操作符“+”的實現(xiàn)機(jī)制,真正執(zhí)行是在ExecInterpExpr函數(shù)中:

ExecInterpExpr
  EEO_CASE(EEOP_FUNCEXPR_STRICT)//操作符函數(shù)的執(zhí)行
  {
    FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
    NullableDatum *args = fcinfo->args;
    int      argno;
    Datum    d;


    /* strict function, so check for NULL args */
    for (argno = 0; argno < op->d.func.nargs; argno++)
    {
      if (args[argno].isnull)
      {
        *op->resnull = true;//只要有一個參數(shù)是NULL,就標(biāo)記resnull為true
        goto strictfail;
      }
    }
    fcinfo->isnull = false;
    d = op->d.func.fn_addr(fcinfo);
    *op->resvalue = d;
    *op->resnull = fcinfo->isnull;


strictfail:
    EEO_NEXT();
  }
  ...
  EEO_CASE(EEOP_ASSIGN_TMP_MAKE_RO)
  {
    int  resultnum = op->d.assign_tmp.resultnum;
    //上一步的resnull值傳遞到resultslot中,標(biāo)記該slot是一個NULL
    resultslot->tts_isnull[resultnum] = state->resnull;
    if (!resultslot->tts_isnull[resultnum])
      resultslot->tts_values[resultnum] =
        MakeExpandedObjectReadOnlyInternal(state->resvalue);
    else
      resultslot->tts_values[resultnum] = state->resvalue;
    EEO_NEXT();
  }

這樣就完成了NULL值相關(guān)的加法計算。

總結(jié)

到此這篇關(guān)于postgresql處理空值NULL與替換的問題解決辦法的文章就介紹到這了,更多相關(guān)postgresql空值NULL與替換處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • phpPgAdmin 配置文件參數(shù)說明中文版

    phpPgAdmin 配置文件參數(shù)說明中文版

    這篇文章主要介紹了phpPgAdmin配置文件config.inc.php-dist中注釋的詳細(xì)說明,并翻譯成中文,需要的朋友可以參考下
    2014-03-03
  • PostgreSQL備份和還原命令整理大全

    PostgreSQL備份和還原命令整理大全

    這篇文章主要給大家介紹了關(guān)于PostgreSQL備份和還原命令整理的相關(guān)資料,PostgreSQL是一款非常強(qiáng)大的開源數(shù)據(jù)庫系統(tǒng),提供種類繁多的備份選項,包括完全備份、增量備份等,需要的朋友可以參考下
    2023-07-07
  • PostgreSQL數(shù)據(jù)庫性能調(diào)優(yōu)的注意點以及pg數(shù)據(jù)庫性能優(yōu)化方式

    PostgreSQL數(shù)據(jù)庫性能調(diào)優(yōu)的注意點以及pg數(shù)據(jù)庫性能優(yōu)化方式

    這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫性能調(diào)優(yōu)的注意點以及pg數(shù)據(jù)庫性能優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 在postgresql中通過命令行執(zhí)行sql文件

    在postgresql中通過命令行執(zhí)行sql文件

    這篇文章主要介紹了在postgresql中通過命令行執(zhí)行sql文件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL中進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出的示例代碼

    PostgreSQL中進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出的示例代碼

    在數(shù)據(jù)庫管理中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是非常常見的操作,特別是在 PostgreSQL 中,提供了多種工具和方法來實現(xiàn)數(shù)據(jù)的有效管理,本文將詳細(xì)介紹在 PostgreSQL 中如何進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出,并給出具體的命令及示例,需要的朋友可以參考下
    2026-03-03
  • PostGresql 實現(xiàn)四舍五入、小數(shù)轉(zhuǎn)換、百分比的用法說明

    PostGresql 實現(xiàn)四舍五入、小數(shù)轉(zhuǎn)換、百分比的用法說明

    這篇文章主要介紹了PostGresql 實現(xiàn)四舍五入、小數(shù)轉(zhuǎn)換、百分比的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • postgres 實現(xiàn)查詢某條數(shù)據(jù)的排名

    postgres 實現(xiàn)查詢某條數(shù)據(jù)的排名

    這篇文章主要介紹了postgres 實現(xiàn)查詢某條數(shù)據(jù)的排名,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL創(chuàng)建觸發(fā)器的實現(xiàn)示例

    PostgreSQL創(chuàng)建觸發(fā)器的實現(xiàn)示例

    PostgreSQL的觸發(fā)器Trigger是一類特殊的數(shù)據(jù)庫對象,本文主要介紹了PostgreSQL創(chuàng)建觸發(fā)器的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • PostgreSQL中NULL陷阱的排除過濾指南

    PostgreSQL中NULL陷阱的排除過濾指南

    文章講述了在SQL中處理NULL值時遇到的常見問題,尤其在使用三值邏輯時容易出現(xiàn)問題,通過具體例子展示了如何避免隱式過濾NULL值,并提出了清晰的解決方案,同時,還列舉了其他常見的NULL值陷阱,并提供了快速驗證字段NULL情況的方法,需要的朋友可以參考下
    2026-05-05
  • 修改postgresql存儲目錄的操作方式

    修改postgresql存儲目錄的操作方式

    這篇文章主要介紹了修改postgresql存儲目錄的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論

崇信县| 昆明市| 射洪县| 垣曲县| 安徽省| 甘孜县| 华坪县| 广州市| 洛宁县| 禹州市| 安吉县| 慈溪市| 明光市| 托里县| 察雅县| 丰城市| 扬中市| 公主岭市| 重庆市| 台山市| 永城市| 横山县| 鄱阳县| 库车县| 台安县| 许昌县| 八宿县| 吉林省| 冷水江市| 香港 | 吉安市| 沛县| 宕昌县| 潢川县| 乌恰县| 门头沟区| 宁阳县| 南华县| 巧家县| 莎车县| 湘西|