postgresql - postgresql 中不存在 PSQL 运算符
问题描述
这是我的原始查询,它在 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 是一个布尔值。
我可能有一个解决方案将查询与 gsm.fiber 的字符串值连接起来,但它不是很优雅。
解决方案
我猜 PostgreSQL 不知道 CTE 中的列是什么类型。当你这样说时pg_admin
:
WITH myconstants (nb_pieces,nb_room,is_fiber) as (
values (0,0,true)
)
每个人都知道这true
是一个布尔值,所以一切正常。但是当你在 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)
)
推荐阅读
- mysql - SQL 查询优化 - 性能问题
- android - 即使在屏幕锁定时也能在前台服务中永久连接
- oauth-2.0 - 在授权代码授予工作流程中,应提出什么请求以将代码交换为令牌?
- json - 无法使用类型为“(Codable.Type?
- android - “Delphi 10.3 Rio”中 TChart 的屏幕方向问题
- common-lisp - 在 sbcl 类型声明中使用异或
- php - whatsapp/chat-api v3.2.0.1 需要 ext-mcrypt * -> 您的系统中缺少请求的 PHP 扩展 mcrypt
- batch-file - Windows 10 中 for for 循环的奇怪行为
- google-cloud-dataflow - 如何在 Cloud Dataflow 中验证基于服务帐户的身份验证
- typescript - 基于参数的firestore查询中的条件where子句