了解SQL中的显式类型转换

时间:2017-02-16 09:35:03

标签: sql postgresql

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 attrvarchar列,prod_id是整数列。

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

4 个答案:

答案 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,但上部嵌套中的integeroption_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')));