2 回答
![?](http://img1.sycdn.imooc.com/5458662500019a7c02200220-100-100.jpg)
TA贡献1865条经验 获得超7个赞
这与 postgres 解析器如何解析参数类型有关。我不知道它是如何实现的,但考虑到观察到的行为,我会假设INSERT
查询不会失败,因为很明显(name,some_other_id) VALUES ($1,$2)
参数应该与目标列$2
具有相同的类型,即 type 。然后,此类型信息也用于查询部分的表达式。some_other_id
int8
NULLIF
DO UPDATE SET
您还可以通过使用(name) VALUES ($1)
in来测试此假设INSERT
,您将看到 in 中的NULLIF
表达式随后将以与查询DO UPDATE SET
中相同的方式失败。UPDATE
因此UPDATE
查询失败,因为没有足够的上下文供解析器推断$2
参数的准确类型。解析器可以用来推断类型的“最接近”的东西$2
是NULLIF
调用表达式,特别是它使用调用表达式的第二个参数的类型,即0
类型为int4
,然后它使用该类型信息第一个论点,即$2
。
为避免此问题,您应该对无法准确推断类型的任何参数使用显式类型转换。即使用NULLIF($2::int8, 0)
.
![?](http://img1.sycdn.imooc.com/533e4c7b00013f3c02400205-100-100.jpg)
TA贡献1866条经验 获得超5个赞
COALESCE(NULLIF($51, CAST(0 AS BIGINT)), object.some_other_id)
五十一?真的吗?
pq:值“1010101010144”超出整数类型的范围
请注意,错误消息中的数据类型是integer,而不是bigint。
我认为错误的原因是显示代码不足。于是我拿出一个魔法水晶球,用手传球。
一个“安装”端点,它像这样有效地充当一个 upsert 函数
我还有一个“更新”端点
您是否将端点称为PostgreSQL 函数(存储过程)?我想是的。另外 $1, $2 看起来像 PostgreSQL 函数参数。
魔法水晶球说:您有两个具有不同数据类型参数的 PostgreSQL 函数:
“安装”端点具有 $2 函数参数作为bigint数据类型。看起来像
CREATE FUNCTION Install(VARCHAR(255), bigint)
“更新”端点具有 $2 函数参数作为整数数据类型,而不是bigint。它看起来像
CREATE FUNCTION Update(VARCHAR(255), integer)
。
最后,我会更容易理解地重写你的条件:
UPDATE object
SET some_other_id =
CASE
WHEN $2 = 0 THEN object.some_other_id
ELSE $2
END
WHERE name = $1
- 2 回答
- 0 关注
- 138 浏览
添加回答
举报