PL/pgSQL 函数用来自其他属性的所有 NOT NULL 值填充属性

Posted

技术标签:

【中文标题】PL/pgSQL 函数用来自其他属性的所有 NOT NULL 值填充属性【英文标题】:PL/pgSQL function to populate an attribute with all NOT NULL values from other attributes 【发布时间】:2021-12-07 17:53:09 【问题描述】:

我正在尝试创建一个函数,该函数将返回一个属性,该属性填充了来自另一个表的其他两个 INT 类型属性的所有 NOT NULL 值。

另外,结果必须是 varchar(12) 的一个属性

这是我的代码:

CREATE OR REPLACE FUNCTION fn_get_info_by_sponsor
       (select_date tb_register.register_ts%type, sponsor tb_sponsor.name%type)
RETURNS SETOF sponsor_data LANGUAGE plpgsql AS $$
DECLARE
      sponsor sponsor_data;
BEGIN
      SELECT
             tb_sponsor.email,
             tb_finance.sponsor_name,
             tb_athlete.name,
             tb_discipline.name,
             tb_register.round_number, 
             COALESCE(CAST(tb_register.register_time AS varchar(12)),CAST(tb_register.register_measure AS varchar(12)),
             tb_register.register_position,
             DATE(tb_register.register_ts)
                
       INTO sponsor
       FROM olympic.tb_sponsor
       
       INNER JOIN olympic.tb_finance
           ON (tb_finance.sponsor_name = tb_sponsor.name)
       INNER JOIN olympic.tb_athlete
           ON tb_athlete.athlete_id = tb_finance.athlete_id
       INNER JOIN olympic.tb_register
           ON tb_register.athlete_id = tb_athlete.athlete_id
       INNER JOIN olympic.tb_discipline
           ON tb_discipline.discipline_id = tb_register.discipline_id
       ORDER BY sponsor;

      RETURN NEXT sponsor ;
END ;  
$$;

我尝试使用 COALESCE,但不确定是否可以将属性用作 COALESCE 表达式值?

谁能帮我理解这个问题的解决方案是什么?

谢谢(:

添加一些示例数据:

athlete_id, round_number, discipline_id, register_date, register_positon, register_time, register_measure,


"1320573"   0   1   "2021-06-02"    0       29.5
"1304325"   0   1   "2021-06-02"    1       29.57
"1281372"   0   1   "2021-06-03"    2       29.65
"1378860"   0   1   "2021-06-04"    3       29.75
"1324035"   0   1   "2021-06-01"    4       29.79
"1429024"   0   1   "2021-06-02"    5       29.82
"1346893"   0   1   "2021-06-04"    6       29.85
"1324053"   0   1   "2021-06-03"    7       29.89
"1324193"   0   1   "2021-06-04"    8       29.96
"1323940"   0   1   "2021-06-01"    9       30.02
"1444814"   1   2   "2021-06-04"    1   "00:10:57"  
"1355032"   1   2   "2021-06-08"    2   "00:11:00"  
"1870169"   1   2   "2021-06-06"    3   "00:11:06"  
"1458862"   1   2   "2021-06-08"    4   "00:11:14"  
"1354946"   1   2   "2021-06-09"    5   "00:11:21"  
"1323812"   1   2   "2021-06-06"    6   "00:11:30"  
"1281464"   1   2   "2021-06-08"    7   "00:11:32"  
"1305865"   1   2   "2021-06-09"    8   "00:11:40"  
"1354902"   1   2   "2021-06-06"    9   "00:11:45"  
"1461993"   2   2   "2021-06-13"    0   "00:10:04"  
"1479209"   2   2   "2021-06-12"    1   "00:10:14"  
"1377716"   2   2   "2021-06-13"    2   "00:10:18"  
"1876984"   2   2   "2021-06-14"    3   "00:10:25"  
"1475004"   2   2   "2021-06-10"    4   "00:10:31"  
"1324488"   2   2   "2021-06-10"    5   "00:10:36"  

【问题讨论】:

首先是什么意思? Coalesce 按列出的顺序检查每个参数值,它返回按检查顺序排列的第一个非空值。如果所有参数都为 null,则返回 null。为防止您提供默认值 not null 作为最后一个参数, @Belayer 属性 register_time 和 register_measure 有一些空值。我想要实现的是创建另一个属性 x,它将包含来自 register_time 和 register_measure 的所有非空值。我尝试使用 Coalesce 但它不起作用,这就是我在这里提出问题的原因(: 如果我理解描述,那么没有coalesce 不能这样做。 Coalesce 选择替代方案,描述似乎表明您正在寻找的是 concat 函数(不是运算符, || )。但是,您的意思是在所有行中的每一行内,然后在外部查询中 string_agg。最好以文本形式发布样本数据(包括和不包括空值)和该日期的预期结果 - 没有图像 @Belayer 示例数据已添加。您现在可以看到,只要 register_measure 为 NULL,register_time 就不是 NULL,反之亦然 【参考方案1】:

COALESCE 函数返回它的第一个不为空的参数,否则返回第二个,只有当所有参数都为空时才返回 Null。 检查documentation

select COALESCE(null, 'hello');
hello

select COALESCE('text', 'hello');
text

【讨论】:

谢谢!我知道这部分理论和文档。但这并不能回答我的问题。我的问题是,如果可能的话,如何使用 COALESCE 填充没有来自其他属性的空值的属性,而不是如何首先找到,而不是空值。

以上是关于PL/pgSQL 函数用来自其他属性的所有 NOT NULL 值填充属性的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别