【问题标题】:Snowflake ifnull and parse_json when combined it is not working as expected雪花 ifnull 和 parse_json 结合使用时无法按预期工作
【发布时间】:2020-12-01 04:24:04
【问题描述】:

这是我的查询

从表名中选择 object_construct('id', id, alpha, PARSE_JSON(null)) 限制1

输出是 { "id" :1, "alpha":null }

但是当我将 parse_jsonifnull 结合使用时,它会返回空对象 {} 无法按预期工作

select object_construct('id',IFNULL(id, (PARSE_JSON(null)), alpha, IFNULL(alpha, (PARSE_JSON(null))) 来自表名限制 1

以上返回{}

但我需要有空值 { "id" : 1, "alpha" : null }

合并没有任何解决方案?

[问题更新]

感谢费利佩·霍法。

在您的回答中,最后一部分按预期工作。

SELECT OBJECT_CONSTRUCT('id', id, 'alpha', IFNULL(alpha, PARSE_JSON('null')))
FROM (SELECT 1 id, null alpha)
# {"alpha": null, "id": 1}

但是当我尝试以下方法时,它不起作用

SELECT OBJECT_CONSTRUCT(
'id', id, 
'alpha', IFNULL(alpha, PARSE_JSON('null'))
 ) 
FROM (SELECT id, alpha from tableName)
#{ "id" :1 }

当使用您的 FROM 查询时,它可以工作:FROM (SELECT 1 id, null alpha)

在使用我的 FROM 查询时不起作用:FROM (SELECT id, alpha from tableName)

希望破灭。

提前致谢

【问题讨论】:

  • 您需要使用 IS_NULL_VALUE 来测试 JSON 中的空值。

标签: snowflake-cloud-data-platform snowflake-schema snowflake-task


【解决方案1】:

我需要空值 { "id" : 1, "alpha" : null }

您可以使用OBJECT_CONSTRUCT_KEEP_NULL 代替OBJECT_CONSTRUCT

SELECT OBJECT_CONSTRUCT_KEEP_NULL('id', id, 'alpha', alpha) from tableName;

SELECT OBJECT_CONSTRUCT_KEEP_NULL(*) from (SELECT id, alpha from tableName) sub;

【讨论】:

    【解决方案2】:

    这里的问题是问题的第一个陈述不正确。编码PARSE_JSON(null)时,不表示null

    SELECT OBJECT_CONSTRUCT('id', id, alpha, PARSE_JSON(null))
    FROM (SELECT 1 id, null alpha)
    
    # {"id": 1}
    

    要解决此问题,您必须改为使用 PARSE_JSON('null') 并引用变量的名称:

    SELECT OBJECT_CONSTRUCT('id', id, 'alpha', PARSE_JSON('null'))
    FROM (SELECT 1 id, null alpha)
    
    # {"alpha": null, "id": 1}
    

    这样看起来更好。解决了这个问题,现在IF_NULL 将按需要工作:

    SELECT OBJECT_CONSTRUCT('id', id, 'alpha', IFNULL(alpha, PARSE_JSON('null')))
    FROM (SELECT 1 id, null alpha)
    
    # {"alpha": null, "id": 1}
    

    【讨论】:

    • SELECT OBJECT_CONSTRUCT('id', id, 'alpha', IFNULL(alpha, PARSE_JSON('null'))) FROM (SELECT 1 id, null alpha) 这是有效的。但不是来自 SELECT OBJECT_CONSTRUCT('id', id, 'alpha', IFNULL(alpha, PARSE_JSON('null'))) FROM (SELECT id, alpha from tableName) 谢谢
    • 我不确定前面的评论是什么意思
    • SELECT OBJECT_CONSTRUCT('id', id, 'alpha', IFNULL(alpha, PARSE_JSON('null'))) FROM (SELECT 1 id, null alpha) 这工作正常。但是当我尝试“带有表名的列名”时,它在雪花中不起作用(不显示 NULL 值)。下面的示例 SELECT OBJECT_CONSTRUCT('id', id, 'alpha', IFNULL(alpha, PARSE_JSON('null'))) FROM (SELECT id, alpha from tableName)
    • " FROM (SELECT id, alpha from tableName) " 当我尝试使用它时,它现在按预期工作。
    猜你喜欢
    • 2021-10-02
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2014-08-03
    • 1970-01-01
    • 2016-10-13
    • 2020-05-04
    相关资源
    最近更新 更多