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 值填充属性的主要内容,如果未能解决你的问题,请参考以下文章