首页 > 解决方案 > 在 Snowflake IN 子查询中使用 UPPER 时获取“无法评估不支持的子查询类型”

问题描述

我有一个雪花表如下:

create table field_names_to_retrieve("QualifiedApiName" varchar(80));
INSERT INTO field_names_to_retrieve VALUES ('reason');
INSERT INTO field_names_to_retrieve VALUES ('reason__c');
INSERT INTO field_names_to_retrieve VALUES ('name__c'); 
INSERT INTO field_names_to_retrieve VALUES ('email__c');  

如果我运行以下查询,它可以工作:

SELECT
    "QualifiedApiName",
    CASE WHEN UPPER(REGEXP_REPLACE("QualifiedApiName", '__c$', '')) NOT IN 
            (SELECT "QualifiedApiName" FROM "field_names_to_retrieve")
        THEN REGEXP_REPLACE("QualifiedApiName", '__c$', '')
    ELSE "QualifiedApiName"
END
FROM
"field_names_to_retrieve";

但是,以下查询不起作用。请注意,子查询中的 UPPER 中有:

SELECT
    "QualifiedApiName",
    CASE WHEN UPPER(REGEXP_REPLACE("QualifiedApiName", '__c$', '')) NOT IN 
            (SELECT UPPER("QualifiedApiName") FROM "field_names_to_retrieve")
        THEN REGEXP_REPLACE("QualifiedApiName", '__c$', '')
    ELSE "QualifiedApiName"
END
FROM
"field_names_to_retrieve";

关于为什么带有 UPPER 的子查询失败的任何想法?

标签: sqlsubquerycommon-table-expressionsnowflake-cloud-data-platformin-subquery

解决方案


显然,表达式是一个问题NOT INNOT IN无论如何,我不鼓励使用with 子查询,因为NULL值不是直观地处理的。

它适用于NOT EXISTS吗?

SELECT (CASE WHEN NOT EXISTS (SELECT 1
                              FROM "field_names_to_retrieve" fntr2
                              WHERE UPPER(REGEXP_REPLACE(fntr."QualifiedApiName", '__c$', '')) = UPPER(fntr2."QualifiedApiName")
                             )
            THEN REGEXP_REPLACE("QualifiedApiName", '__c$', '')
            ELSE "QualifiedApiName"
        END)
FROM "field_names_to_retrieve" fntr;

推荐阅读