2 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
這與 postgres 解析器如何解析參數(shù)類型有關(guān)。我不知道它是如何實(shí)現(xiàn)的,但考慮到觀察到的行為,我會(huì)假設(shè)INSERT
查詢不會(huì)失敗,因?yàn)楹苊黠@(name,some_other_id) VALUES ($1,$2)
參數(shù)應(yīng)該與目標(biāo)列$2
具有相同的類型,即 type 。然后,此類型信息也用于查詢部分的表達(dá)式。some_other_id
int8
NULLIF
DO UPDATE SET
您還可以通過使用(name) VALUES ($1)
in來測試此假設(shè)INSERT
,您將看到 in 中的NULLIF
表達(dá)式隨后將以與查詢DO UPDATE SET
中相同的方式失敗。UPDATE
因此UPDATE
查詢失敗,因?yàn)闆]有足夠的上下文供解析器推斷$2
參數(shù)的準(zhǔn)確類型。解析器可以用來推斷類型的“最接近”的東西$2
是NULLIF
調(diào)用表達(dá)式,特別是它使用調(diào)用表達(dá)式的第二個(gè)參數(shù)的類型,即0
類型為int4
,然后它使用該類型信息第一個(gè)論點(diǎn),即$2
。
為避免此問題,您應(yīng)該對(duì)無法準(zhǔn)確推斷類型的任何參數(shù)使用顯式類型轉(zhuǎn)換。即使用NULLIF($2::int8, 0)
.

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
COALESCE(NULLIF($51, CAST(0 AS BIGINT)), object.some_other_id)
五十一?真的嗎?
pq:值“1010101010144”超出整數(shù)類型的范圍
請(qǐng)注意,錯(cuò)誤消息中的數(shù)據(jù)類型是integer,而不是bigint。
我認(rèn)為錯(cuò)誤的原因是顯示代碼不足。于是我拿出一個(gè)魔法水晶球,用手傳球。
一個(gè)“安裝”端點(diǎn),它像這樣有效地充當(dāng)一個(gè) upsert 函數(shù)
我還有一個(gè)“更新”端點(diǎn)
您是否將端點(diǎn)稱為PostgreSQL 函數(shù)(存儲(chǔ)過程)?我想是的。另外 $1, $2 看起來像 PostgreSQL 函數(shù)參數(shù)。
魔法水晶球說:您有兩個(gè)具有不同數(shù)據(jù)類型參數(shù)的 PostgreSQL 函數(shù):
“安裝”端點(diǎn)具有 $2 函數(shù)參數(shù)作為bigint數(shù)據(jù)類型。看起來像
CREATE FUNCTION Install(VARCHAR(255), bigint)
“更新”端點(diǎn)具有 $2 函數(shù)參數(shù)作為整數(shù)數(shù)據(jù)類型,而不是bigint。它看起來像
CREATE FUNCTION Update(VARCHAR(255), integer)
。
最后,我會(huì)更容易理解地重寫你的條件:
UPDATE object
SET some_other_id =
CASE
WHEN $2 = 0 THEN object.some_other_id
ELSE $2
END
WHERE name = $1
- 2 回答
- 0 關(guān)注
- 179 瀏覽
添加回答
舉報(bào)