簡體   English   中英

postgresql 中不存在 PSQL 運算符

[英]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最終嘗試將textboolean進行比較。

你應該可以通過一些鑄造來解決這個問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM