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' and type_sub_group='category' and type_attr in(SELECT ...
^
提示:没有与给定的名称和参数类型匹配的运算符。您可能需要添加显式类型强制转换。type attr
是varchar
列,prod_id
是整数列。
我做错了什么,我该如何解决?如果能解释一下今后如何避免这种情况,将不胜感激。
5条答案
按热度按时间tp5buhyn1#
PostgreSQL是 * 强类型 * -每个值都有定义的类型,每个函数和运算符都被定义为处理特定类型。
有一个运算符用于比较两个
VarChar
值,* 一个不同的运算符 * 用于比较两个Integer
值。两者都拼写为=
,但它们在Postgres的系统目录中是独立的条目。由于没有名为=
的运算符,它在一边接受VarChar
,在另一边接受Integer
,这解释了“运算符不存在”消息。在实践中,经验法则是您需要使
=
符号的两边都是相同的类型,以便可以比较它们。这可以使用标准的SQLCAST(value AS type)
函数来完成,该函数将值从一种类型转换为另一种类型。在本例中,您希望来自内部
SELECT
的结果都是VarChar
s,以便它们可以被馈送到IN
子句中,因此您可以这样写:整数总是可以转换为字符串,因为你总是可以用数字写出一个数字。如果你知道一个字符串只包含数字,你也可以用另一种方式进行转换,例如:
CAST(type_attribute AS int)
.zqry0prt2#
您正在检查type_attribute,这是一个带有整数的varchar字段,即prod_id。你可以做的一件事是在你的子查询中将prod_id类型转换为varchar。
xxb16uws3#
所以你有这样的查询:
让我们从内部查询开始:
如果
link_option_id
是一个integer
,但是来自上层嵌套的option_id
是一个varchar
类型,那么你就会有问题。因此,你需要cast
结果,并得到如下结果:你懂的。同样的逻辑也适用于巢穴。
下面是一些关于CAST功能的更多信息(快速谷歌搜索):http://www.postgresqltutorial.com/postgresql-cast/
2ledvvac4#
在PostgreSQL中,可以使用::符号,例如
7jmck4yq5#
错误:function concat(“unknown”,text,“unknown”,“unknown”,“unknown”,“unknown”,character varying,“unknown”)不存在提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。% 1语句失败。