2010-05-18 86 views
2

我有一個查詢Postgres的柱鑄造

SELECT assetid, type_code, version, name, short_name, status, languages, 
charset, force_secure, created, created_userid, updated, updated_userid, 
published, published_userid, status_changed, status_changed_userid 
FROM sq_ast WHERE assetid = 7 

不工作,並拋出

ERROR: operator does not exist: character varying = integer LINE 4: FROM sq_ast WHERE assetid = 7 

我可以讓它做

SELECT assetid, type_code, version, name, short_name, status, languages, 
charset, force_secure, created, created_userid, updated, updated_userid, 
published, published_userid, status_changed, status_changed_userid 
FROM sq_ast WHERE assetid = '7' 

工作,請注意報價WHERE子句中的7 ...

我正在部署一個巨大的應用程序,我不能改寫核心...同樣我不想冒險改變列的類型...

我不是Postgres專家...請幫助.. 。

是否有嚴格鑄造柱的選項?

+0

哪個PostgreSQL版本?一個快速測試表明8.4允許這樣做。 – araqnid 2010-05-18 19:17:57

回答

6

Postgresql在最近的版本中輸入得更強,這是一件好事。如果assetid是VARCHAR,那麼你不能將它與一個整數相比較(我認爲從8.4開始)。

一般來說(不僅在Postgresql中,不僅在數據庫設計中)混合這些類型的設計很糟糕:數字數據類型應該用於真正的數字字段,而不是用於恰好包含數字的字符串。

例如,發票「號碼」或信用卡「號碼」通常不應表示爲「號碼」,而應表示爲字符串。

然而,有時候,這個決定並不明確(例如:文件編號)。

一些標準,可以幫助:

  • 你在做算術你的價值觀可能有興趣(總和。減去)?至少這是否合理?然後,這是一個number

  • 應該零左被保留,或認爲相關? ('07'被認爲與'7'不同?)然後,它是一個string

根據您在您的方案anwser這些問題(是否有從0開始的由assetid?難道還有一些非數字字符?它似乎是一個序列號?),你可能會考慮到更改字段類型或(在您的情況更可能)做一個演員,在首選方向:

SELECT... FROM sq_ast WHERE assetid::integer = 7 

(如果你決定該字段是數字)或其他地方

SELECT... FROM sq_ast WHERE assetid = '7' 

沒有用於恢復舊行爲的全局設置,並強制對字符類型AFAIK進行隱式轉換。

+0

「沒有恢復到舊行爲的全局設置」 - 在[另一個答案]上找到(http:// stackoverflow。com/a/18129968/243245),你可以創建隱含的強制轉換函數來模仿舊的行爲,例如使用[PostgreSQL維基上的腳本](http://wiki.postgresql.org/wiki/Image:Pg83-implicit-casts.sql)。 – Rup 2014-03-05 18:38:18