You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:20:37