将NULL值从一列迁移到另一列



我有两个列表的订单,

ID OPEN CLOSE
1  {}   {}
2  {}   NULL
3  {}   {}

OPEN/CLOSE列是JSONB列,包含来自第三方API的收据,它们通常只在以后用于分析原因而不被查询。为了区分已完成的订单和仍在等待的订单,如果NOT NULL订单已完成,我检查CLOSE列值。然而,由于第三方API的变化,我将不得不在CLOSE列中保留一些JSON值。我的计划是创建名为STATUS的第三列枚举类型,并使用该枚举跟踪订单的状态。我的问题是如何将数据从CLOSE迁移到STATUS,每个NOT NULL应该得到一个enum休息另一个。

ID OPEN CLOSE  STATUS
1  {}   {}     FILLED
2  {}   NULL   WAITING
3  {}   {}     FILLED

根据CLOSE是否有值,用两个可能的值之一填充STATUS:

update orders set STATUS = (case when CLOSE is null then 'WAITING' else 'FILLED' end);

(未测试)

另一个选项是创建一个名为ClosedDateDateTime列。新列中的NULL值将继续以与当前处理Close列中的NULL值相同的方式处理;任何东西都能告诉你交易结束的确切时间。这将使用更少的存储空间,同时为您提供更多的信息。

…当然,现有数据除外,因为您无法通过模式获得这些信息。对于这些记录,您可以分解现有的JSON数据来找到您想要的值,或者您可以使用一个预先确定的值来表示在跟踪数据之前关闭了记录。

你可以这样做迁移现有的数据:

UPDATE Orders 
SET ClosedDate = CASE WHEN Close IS NULL THEN NULL ELSE CURRENT_DATE END

如果你继续使用status字段(这与我的建议有一个很好的争论,因为它为你在未来设置了更多不同的顺序状态),使用更短的状态代码可能会更好;不需要将整个单词存储在表中。这将适合每页多一些记录,并帮助任何索引使用更少的内存。

最新更新