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 attr
是 varchar
列和 prod_id
是整数列。
我做错了什么,我该如何解决这个问题?非常感谢您解释如何在未来避免这种情况。
原文由 Albertus Brand Venter 发布,翻译遵循 CC BY-SA 4.0 许可协议
PostgreSQL 是 强类型 的——每个值都有一个定义的类型,每个函数和运算符都被定义为使用特定的类型。
有一个运算符用于比较两个
VarChar
值,还有 一个不同的运算符 用于比较两个Integer
值。两者都拼写为=
,但它们是 Postgres 系统目录中的单独条目。由于没有名为=
的操作员在一侧采用VarChar
而在另一侧采用Integer
,这解释了“操作员不存在”消息。在实践中,经验法则是您需要使
=
符号的两侧为相同类型,以便可以比较它们。这可以使用标准 SQLCAST(value AS type)
函数来完成,该函数将值从一种类型转换为另一种类型。在这种情况下,您希望内部
SELECT
的结果全部为VarChar
s,以便它们可以输入IN
写入子句,所以您可以:整数始终可以转换为字符串,因为您始终可以使用数字写出数字。如果您知道一个字符串将只包含数字,您也可以转换为其他方式,例如
CAST(type_attribute AS int)
。