使用 EXCEPT 并标记列差异
Using EXCEPT and flagging column differences
我想要做的是 select 来自 postgres table 的数据,它不会出现在另一个中。两个 table 都有相同的列,禁止在 Varchar(1) 上使用布尔值,但问题是这些列中的数据不匹配。
我知道我可以用 SELECT EXCEPT SELECT 语句来做到这一点,我已经实现并且正在运行。
我想做的是找到一种方法来标记不匹配的列。作为一个想法,我想在不匹配的字段中的数据末尾附加一个字符。
例如,如果一个 table 的 updateflag 与另一个不同,我将返回 '* f' 而不是 'f'
SELECT id, number, "updateflag" from dbc.person
EXCEPT
SELECT id, number, "updateflag":bool from dbg.person;
我是否应该将两个 table 连接在一起,post 执行此语句以识别返回的差异?
我已经尝试研究实现这个的方法,但没有找到任何关于这个主题的东西
为此我更喜欢完全外部联接
select *
from dbc.person p1
full join dbg.person p2 on p1.id = p2.id
where p1 is distinct from p2;
id
列被假定为"links"两个表在一起的主键列。
这只会 return 行,其中至少一列不同。
如果您想查看差异,可以使用 hstore
功能
select hstore(p1) - hstore(p2) as columns_diff_p1,
hstore(p2) - hstore(p1) as columns_diff_p2
from dbc.person p1
full join dbg.person p2 on p1.id = p2.id
where p1 is distinct from p2;
我想要做的是 select 来自 postgres table 的数据,它不会出现在另一个中。两个 table 都有相同的列,禁止在 Varchar(1) 上使用布尔值,但问题是这些列中的数据不匹配。
我知道我可以用 SELECT EXCEPT SELECT 语句来做到这一点,我已经实现并且正在运行。
我想做的是找到一种方法来标记不匹配的列。作为一个想法,我想在不匹配的字段中的数据末尾附加一个字符。
例如,如果一个 table 的 updateflag 与另一个不同,我将返回 '* f' 而不是 'f'
SELECT id, number, "updateflag" from dbc.person
EXCEPT
SELECT id, number, "updateflag":bool from dbg.person;
我是否应该将两个 table 连接在一起,post 执行此语句以识别返回的差异?
我已经尝试研究实现这个的方法,但没有找到任何关于这个主题的东西
为此我更喜欢完全外部联接
select *
from dbc.person p1
full join dbg.person p2 on p1.id = p2.id
where p1 is distinct from p2;
id
列被假定为"links"两个表在一起的主键列。
这只会 return 行,其中至少一列不同。
如果您想查看差异,可以使用 hstore
功能
select hstore(p1) - hstore(p2) as columns_diff_p1,
hstore(p2) - hstore(p1) as columns_diff_p2
from dbc.person p1
full join dbg.person p2 on p1.id = p2.id
where p1 is distinct from p2;