postgresql 了解SQL中的显式类型转换

ars1skjm  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(5)|浏览(220)
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 attrvarchar列,prod_id是整数列。
我做错了什么,我该如何解决?如果能解释一下今后如何避免这种情况,将不胜感激。

tp5buhyn

tp5buhyn1#

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) .

zqry0prt

zqry0prt2#

您正在检查type_attribute,这是一个带有整数的varchar字段,即prod_id。你可以做的一件事是在你的子查询中将prod_id类型转换为varchar。

SELECT Cast(prod_id As varchar)
xxb16uws

xxb16uws3#

所以你有这样的查询:

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结果,并得到如下结果:

SELECT cast(link_option_id,varchar) 
            FROM product_link 
            WHERE link_member_id = '146'

你懂的。同样的逻辑也适用于巢穴。
下面是一些关于CAST功能的更多信息(快速谷歌搜索):http://www.postgresqltutorial.com/postgresql-cast/

2ledvvac

2ledvvac4#

在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')));
7jmck4yq

7jmck4yq5#

错误:function concat(“unknown”,text,“unknown”,“unknown”,“unknown”,“unknown”,character varying,“unknown”)不存在提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。% 1语句失败。

相关问题