PostgreSQL WHERE子句匹配整数ID异常问题排查
PostgreSQL中ABS(差值)=0与ABS(差值)<=0结果不一致的异常问题
原查询语句:
SELECT qs.id_gen::int as qs_i , fi.id_gen::int as fi_i , ABS(qs.id_gen::int - fi.id_gen::int) as delta FROM peap_000.v_tlr_quantita_std qs , peap_000.dbg_gestore fi WHERE ( ABS(qs.id_gen::int - fi.id_gen::int) = 0 AND qs.id_tipofonte = fi.id_tipofonte AND qs.id_questionario = fi.id_questionario )
异常现象
- 执行上述查询仅返回1条记录,与使用
qs.id_gen::int = fi.id_gen::int的结果一致,但不符合预期(应有大量匹配记录); - 将条件
ABS(qs.id_gen::int - fi.id_gen::int) = 0替换为ABS(qs.id_gen::int - fi.id_gen::int) < 0时,无返回结果,符合预期; - 将条件替换为
ABS(qs.id_gen::int - fi.id_gen::int) <= 0时,返回大量符合预期的记录。
环境与表结构信息
- 涉及的表均为视图:
v_tlr_quantita_std是物化视图,dbg_gestore是基于外部数据包装器(FDW)映射自MySQL的视图; id_gen字段:在物化视图中为int4类型,在外部表中映射为int4(原MySQL表对应字段为int(11));- 外部表相关DDL:
CREATE FOREIGN TABLE peap_000.tlr_tblfontequestionario ( "IdTipoFonte" int4 NOT NULL, -- MySQL original int(11) "IdQuestionario" int4 NOT NULL, -- MySQL original int(11) "IdGen" int4 NOT NULL,... -- MySQL original int(11) ) CREATE FOREIGN TABLE peap_000.tlr_tblquestionario ( "IdQuestionario" int4 NOT NULL, -- MySQL original int(11) "Gestore" varchar(50) NOT NULL,... )
补充测试结果
创建临时表tmp123后,执行SELECT * FROM peap_000.tmp123 WHERE (id_gen = id_gen_fi)返回740条符合预期的记录;但直接执行等价逻辑的原查询仅返回1条记录。同样的逻辑差异:abs(id_gen - id_gen_fi) <=0返回预期结果,abs(...) <0无结果,abs(...) =0仅1条记录。
内容的提问来源于stack exchange,提问作者F__L
相关产品推荐
相关产品推荐

