[英]PSQL operator does not exist in postgresql
這是我的原始查詢,它在 pg_admin 中針對同一個數據庫工作:
WITH myconstants (nb_pieces,nb_room,is_fiber) as (
values (0,0,true)
)
SELECT
pbuy.name, seller.name as seller_name, fiche.fiber
FROM
on_plan_buy pbuy
INNER JOIN
card_fiche fiche
ON pbuy.uuid = fiche.ad_uuid
INNER JOIN
on_plan_seller seller
ON pbuy.seller_id = seller.id
INNER JOIN
myconstants conste
ON true
WHERE pbuy.code_insee IN ('92108','75018')
AND pbuy.price <= 9999999 AND pbuy.price >= 0
AND CASE WHEN conste.is_fiber = false THEN true ELSE fiche.fiber = true END
LIMIT 100;
但是當我在golang中這樣做時:
query = `
WITH myconstants (nb_pieces,nb_room,is_fiber) as (
values ($3,$4,$5)
)
SELECT
pbuy.name
FROM
` + tableOnPlan + ` pbuy
INNER JOIN
card_fiche fiche
ON pbuy.uuid = fiche.ad_uuid
INNER JOIN
myconstants conste
ON true
WHERE pbuy.code_insee IN ('` + strings.Join(gsm.CodeInsee, "','") + `')
AND pbuy.price <= $1 AND pbuy.price >= $2
AND CASE WHEN conste.is_fiber = false THEN true ELSE fiche.fiber = true END
LIMIT 100;
`
//AND CASE WHEN conste.nb_pieces = 0 THEN pbuy.piece > 0 ELSE pbuy.piece = conste.nb_pieces END
//AND CASE WHEN conste.nb_room = 0 THEN pbuy.chambre > 0 ELSE pbuy.chambre = conste.nb_room END
//AND CASE WHEN conste.is_fiber = false THEN true ELSE fiche.fiber = true END
fmt.Println(query)
err = db.Select(&response.Offers, query, gsm.PriceMax, gsm.PriceMin, gsm.NbRoom, gsm.NbChamber, gsm.Fiber)
使用 gsm 的這種結構:
type GetSearchMsg struct {
Adresse string `json:"adresse"`
CodeInsee []string `json:"code_insee"`
M2 int `json:"m2"`
PriceMin int `json:"price_min"`
PriceMax int `json:"price_max"`
Type string `json:"type"`
NbRoom int `json:"nb_room"`
NbChamber int `json:"nb_chamber"`
TypeConstruction string `json:"TypeConstruction"`
TypeTravel string `json:"type_travel"`
GeoId string `json:"geo_id"`
TimeTravel string `json:"time_travel"`
Fiber bool `json:"fiber"`
}
我有一個:
ERRO[0002] pq: operator does not exist: text = boolean error=TestError
panic: pq: operator does not exist: text = boolean
當我在 IDE 中翻轉 gsm.fiber 時,它仍然告訴我 gsm.fiber 是 boolean。
我可能有一個解決方案將查詢與 gsm.fiber 的字符串值連接起來,但它不是很優雅。
我猜想 PostgreSQL 不知道您的 CTE 中的列是什么類型。 當您在pg_admin
中這樣說時:
WITH myconstants (nb_pieces,nb_room,is_fiber) as (
values (0,0,true)
)
每個人都知道true
是 boolean 所以一切正常。 但是當你在 Go 中使用它時:
WITH myconstants (nb_pieces,nb_room,is_fiber) as (
values ($3,$4,$5)
)
驅動程序可能不知道要使用什么類型,因此它使用text
為$5
,因此conste.is_fiber
具有文本類型,並且conste.is_fiber = false
最終嘗試將text
與boolean
進行比較。
你應該可以通過一些鑄造來解決這個問題:
WITH myconstants (nb_pieces, nb_room, is_fiber) as (
values ($3::int, $4::int, $5::boolean)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.