了解 SQL 中的显式类型转换

新手上路,请多包涵
SELECT *
FROM lookup_type
WHERE type_group = 'enquiry'
  AND type_sub_group = 'category'
  AND type_attribute IN (SELECT prod_id
                         FROM product
                         WHERE prod_id IN (SELECT option_prod_id
                                           FROM product_option
                                           WHERE option_id IN (SELECT link_option_id
                                                               FROM product_link
                                                               WHERE link_member_id = '146')));

在上面的查询中,我想在我的查找表中选择一条记录。但是,我从我的 postgreSQL 客户端收到以下错误。

错误:运算符不存在:字符变化 = 整数

第 1 行: …uiry’ 和 type_sub_group=‘category’ 和 type_attr in(SELECT …

^

提示:没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。

type attrvarchar 列和 prod_id 是整数列。

我做错了什么,我该如何解决这个问题?非常感谢您解释如何在未来避免这种情况。

原文由 Albertus Brand Venter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 531
2 个回答

PostgreSQL 是 强类型 的——每个值都有一个定义的类型,每个函数和运算符都被定义为使用特定的类型。

有一个运算符用于比较两个 VarChar 值,还有 一个不同的运算符 用于比较两个 Integer 值。两者都拼写为 = ,但它们是 Postgres 系统目录中的单独条目。由于没有名为 = 的操作员在一侧采用 VarChar 而在另一侧采用 Integer ,这解释了“操作员不存在”消息。

在实践中,经验法则是您需要使 = 符号的两侧为相同类型,以便可以比较它们。这可以使用标准 SQL CAST(value AS type) 函数来完成,该函数将值从一种类型转换为另一种类型。

在这种情况下,您希望内部 SELECT 的结果全部为 VarChar s,以便它们可以输入 IN 写入子句,所以您可以:

 ... and type_attribute in (SELECT CAST(prod_id as VarChar) ...

整数始终可以转换为字符串,因为您始终可以使用数字写出数字。如果您知道一个字符串将只包含数字,您也可以转换为其他方式,例如 CAST(type_attribute AS int)

原文由 IMSoP 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 PostgreSQL 中,您可以使用 :: 表示法进行转换,例如

SELECT *
FROM lookup_type
WHERE type_group = 'enquiry'
 and type_sub_group='category'
 and type_attribute in (SELECT prod_id::varchar
                        FROM product
                        WHERE prod_id in (SELECT option_prod_id
                                          FROM product_option
                                          WHERE option_id in (SELECT link_option_id
                                                              FROM product_link
                                                              WHERE link_member_id = '146')));

原文由 Erich Kitzmueller 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题