首页 > 解决方案 > 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 的字符串值连接起来,但它不是很优雅。

标签: postgresqlgo

解决方案


我猜 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最终尝试textboolean.

你应该可以通过一些铸造来解决这个问题:

WITH myconstants (nb_pieces, nb_room, is_fiber) as (
    values ($3::int, $4::int, $5::boolean)
)

推荐阅读