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 ='类别'和type_attr in(SELECT ...
^提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
type attr
是varchar
列,prod_id
是整数列。
我做错了什么,如何解决这个问题?非常感谢将来如何避免这种情况的解释。
答案 0 :(得分:8)
PostgreSQL 强类型 - 每个值都有一个已定义的类型,并且每个函数和运算符都被定义为使用特定类型。
有一个运算符用于比较两个VarChar
值,一个不同的运算符用于比较两个Integer
值。两者都恰好拼写为=
,但它们是Postgres系统目录中的单独条目。由于没有名为=
的运算符,其一方为VarChar
而另一方为Integer
,这说明“运算符不存在”消息。
在实践中,经验法则是你需要使=
符号的两边都是相同的类型,以便可以比较它们。这可以使用标准SQL CAST(value AS type)
函数来完成,该函数将值从一种类型转换为另一种类型。
在这种情况下,您希望内部SELECT
的结果全部为VarChar
,以便将它们输入IN
子句,以便您可以写:
... and type_attribute in (SELECT CAST(prod_id as VarChar) ...
始终可以将整数强制转换为字符串,因为您始终可以使用数字写出数字。如果您知道字符串只包含数字,您也可以使用其他方式进行转换,例如CAST(type_attribute AS int)
。
答案 1 :(得分:3)
您正在检查type_attribute,它是一个带有整数的varchar字段,即prod_id。你可以做的一件事是在你的子查询中输入cast prod_id到varchar。
SELECT Cast(prod_id As varchar)
答案 2 :(得分:1)
所以你有这样的查询:
woocommerce_ajax_add_order_item_meta
让我们从内部查询开始:
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'
)
)
);
如果 SELECT link_option_id
FROM product_link
WHERE link_member_id = '146'
是link_option_id
,但上部嵌套中的integer
是option_id
类型,则会出现问题。因此,您需要varchar
结果并将其设为:
cast
你明白了。必须在巢穴上应用相同的逻辑。
以下是有关CAST功能的更多信息(快速谷歌搜索): http://www.postgresqltutorial.com/postgresql-cast/
答案 3 :(得分:0)
在PostgreSQL中,您可以使用:: notation进行强制转换,例如
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')));