Postgres列转换

3

我有一个问题

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可以实现此功能。 - araqnid
1个回答

8
Postgresql在最近的版本中更加强调类型,这是一件好事。如果assetid是VARCHAR类型,那么您就不能将它与整数进行比较(从8.4开始,我相信)。
通常情况下(不仅在Postgresql中,也不仅在数据库设计中),混合使用这些类型都是糟糕的设计:数字数据类型应该用于真正的数字字段,而不是仅由数字组成的字符串字段。
例如,发票“号码”或信用卡“号码”通常不应表示为“数字”,而应表示为字符串。
然而,有时决策并不清晰(例如:文档编号)。
以下是一些可以帮助您做出决策的标准:
  • 您是否有可能对值进行算术运算(求和、减法)?这至少有意义吗?那么,它就是一个数字

  • 左侧的零是否需要保留,或者被视为相关的?('07'是否应与'7'区别对待?)那么,它就是一个字符串

根据您在您的情境中如何回答这些问题(是否有以0开头的assetid?可能会有一些非数字字符吗?看起来像是一个序列号吗?),您可以考虑更改字段类型或(在您的情境中更有可能)进行转换,朝着首选方向进行。
   SELECT... FROM sq_ast WHERE assetid::integer = 7

(如果您决定该字段是数字)或其他地方。
   SELECT... FROM sq_ast WHERE assetid = '7'

据我所知,没有全局设置可以恢复到旧的行为,并强制进行字符类型的隐式转换。


没有全局设置来恢复旧的行为 - 可以使用PostgreSQL WiKi上的脚本创建隐式转换函数来模拟旧的行为,例如。 - Rup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接