【发布时间】:2016-01-23 05:54:51
【问题描述】:
我在 Postgres 数据库中有一个表,其中包含从 2012 年到 2018 年底的月度列:
create table sales_data (
part_number text not null,
customer text not null,
qty_2012_01 numeric,
qty_2012_02 numeric,
qty_2012_03 numeric,
...
qty_2018_10 numeric,
qty_2018_11 numeric,
qty_2018_12 numeric,
constraint sales_data_pk primary key (part_number, customer)
);
数据由一个大型函数填充,该函数从极其广泛的来源中提取数据。它涉及许多左连接——例如,将历史与未来数据相结合,其中单个项目可能有历史但没有未来需求,反之亦然。或者,某些客户可能没有我们想要的数据。
我想出的问题是由于左连接(以及我要提取的数据的性质),我要提取的大量值是空的。我希望任何 null 都为零,以简化对该表的任何查询,特别是聚合函数,例如 1 + null + 2 = null。
我可以修改函数并添加数百个合并语句。但是,我希望有另一种解决方法,即使这意味着事后修改值。也就是说,这意味着在函数末尾添加 84 条更新语句:
update sales_data set qty_2012_01 = 0 where qty_2012_01 is null;
update sales_data set qty_2012_02 = 0 where qty_2012_02 is null;
update sales_data set qty_2012_03 = 0 where qty_2012_03 is null;
... 78 more like this...
update sales_data set qty_2018_10 = 0 where qty_2018_10 is null;
update sales_data set qty_2018_11 = 0 where qty_2018_11 is null;
update sales_data set qty_2018_12 = 0 where qty_2018_12 is null;
我错过了什么,对吧?有没有更简单的方法?
我希望列上的default 设置会强制为零,但是当函数明确告诉它插入空值时它不起作用。同样,如果我使列不可为空,它只会在我的插入时呕吐——我希望这可能会强制调用默认值。
顺便说一句,插入然后更新策略是我责备其他人的策略,所以我知道这不太理想。这个功能有点像野兽,它确实需要一些偶尔的维护(长话短说)。我的主要目标是尽可能保持函数的可读性和可维护性——而不是让函数变得超级高效。表本身并不大 - 毕竟不到一百万条记录 - 我们运行该函数以每月填充一次或两次。
【问题讨论】:
-
"从 2012 年到 2018 年底的月度列:" - 为什么?如果您正确规范化您的数据模型,那么这只是一个
update语句。 -
@a_horse_with_no_name -- 确实是一个公平的问题。数据实际上是以图表的形式呈现在 Excel 中。如果我们将其作为标准化数据进行,则将有数百万行,然后必须在数据透视表/图表中进行汇总。非规范化是设计使然,以便在显示工具中快速执行。我们有其他地方的数据,标准化。该函数采用这些不同的数据源并填充此表
标签: sql postgresql null dynamic-sql coalesce