【问题标题】:Snowflake - Invalid argument > types for function 'IFF': (VARCHAR(16777216), VARCHAR(16777216), NULL)雪花 - 无效的参数 > 函数“IFF”的类型:(VARCHAR(16777216),VARCHAR(16777216),NULL)
【发布时间】:2021-07-27 05:26:02
【问题描述】:

我有 3 列要查看,namename2name3,每行中只有 1 列的值看起来像这样,一个单词后跟一个列表 randomword [m=444] 我有要检查每一列,然后我必须提取该列表中的数字,所以从我的示例中我需要444。 我尝试了以下方法:

Select *,
CASE
 WHEN REGEXP_SUBSTR(NAME, '(?:\[m=)') THEN REGEXP_SUBSTR(NAME, '[[]m=([0-9]+)'),
 WHEN REGEXP_SUBSTR(NAME2, '(?:\[m=)') THEN REGEXP_SUBSTR(NAME2, '[[]m=([0-9]+)'),
WHEN REGEXP_SUBSTR(NAME3, '(?:\[m=)') THEN REGEXP_SUBSTR(NAME3, '[[]m=([0-9]+)'),
ELSE null
END
from my_table

但现在我看到了这个错误:

SQL 编译错误:位置 0 处的错误行 2 无效参数 函数“IFF”的类型:(VARCHAR(16777216), VARCHAR(16777216), NULL)

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    CASE 表达式中的条件不是条件。 Regexp_Substr 返回字符串或 NULL。它不会返回 TRUEFALSE 所要求的 WHEN 子句。

    相反,您需要测试是否从 REGEXP_SUBSTR IS NOT NULL 返回:

     CASE
     WHEN REGEXP_SUBSTR(NAME, '(?:\[m=)') IS NOT NULL THEN REGEXP_SUBSTR(NAME, '[[]m=([0-9]+)')
     WHEN REGEXP_SUBSTR(NAME2, '(?:\[m=)') IS NOT NULL THEN REGEXP_SUBSTR(NAME2, '[[]m=([0-9]+)')
    WHEN REGEXP_SUBSTR(NAME3, '(?:\[m=)') IS NOT NULL THEN REGEXP_SUBSTR(NAME3, '[[]m=([0-9]+)')
    ELSE null
    END
    

    话虽如此,只要您的CASE 表达式采用这种形式,例如CASE WHEN foo1 IS NOT NULL THEN foo1 WHEN foo2 IS NOT NULL THEN foo2 WHEN foo3 IS NOT NULL THEN foo3 ELSE NULL END,在语法上就写成:COALESCE(foo1, foo2, foo3) 会更简洁。这两个语句给出了相同的结果。

    在这种情况下:

    COALESCE(REGEXP_SUBSTR(NAME, '(?:\[m=)'), REGEXP_SUBSTR(NAME2, '(?:\[m=)'), REGEXP_SUBSTR(NAME3, '(?:\[m=)'))
    

    【讨论】:

    • 感谢您解释得如此清楚,但 THEN 语句与我的 WHEN 不同,在第一部分中,我在行中寻找 [m=,如果找到,那么我只想要数字在它们中,所以如果一行有'test [m = 111]'我只想要111。对于你提到的CASE WHEN示例,它不会遍历每一列并提取它。相反,它看起来像是在查看第一列 NAME,如果它没有找到它的 NULL,我如何得到它然后转到 NAME2、NAME3 等。
    • 如果在第一个 NAME 中没有找到它,这个 case 表达式绝对会转到下一个 NAME2 列并尝试代替。然后它测试NAME3 是否NAME2 为空,最后它放弃并返回NULL。它应该像你想要的那样工作。
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多