【问题标题】:Postgres column castingPostgres 列铸造
【发布时间】:2010-05-18 18:43:39
【问题描述】:

我有一个问题

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 专家...请帮助...

是否有严格强制转换列的选项???

【问题讨论】:

  • 哪个 PostgreSQL 版本?快速测试表明 8.4 允许这样做。

标签: postgresql


【解决方案1】:

Postgresql 在最近的版本中具有更强的类型,这是一件好事。如果assetid 是 VARCHAR,那么您不能将它与整数进行比较(我相信从 8.4 开始)。

一般来说(不仅在 Postgresql 中,不仅在数据库设计中)混合这些类型是不好的设计:数字数据类型应该用于实数字段,而不是恰好由数字组成的字符串。

例如,发票“编号”或信用卡“编号”通常不应表示为“编号”,而应表示为字符串。

但有时,决定并不明确(例如:文件编号)。

一些可以提供帮助的标准:

  • 您是否有兴趣使用您的值(求和、减法)进行算术?这至少有意义吗?然后是number

  • 是否应该左侧的零被保留,或者被认为是相关的? ('07'和'7'算不算不同?)那么,就是string

根据您在场景中如何回答这些问题(是否有以 0 开头的assetid?是否有一些非数字字符?它似乎是序列号?),您可能会考虑更改字段类型或(在您的场景中更有可能)在首选方向上进行投射:

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

(如果您决定该字段是数字)或其他地方

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

没有用于恢复旧行为的全局设置,并强制对字符类型进行隐式转换,AFAIK。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多