在Snowflake变量中检查一个键是否存在

12

在Snowflake变体字段中,是否有一种函数可以检查一个键是否存在?

3个回答

10

您可以使用IS_NULL_VALUE来查看键是否存在。如果键不存在,则结果将为NULL。如果键存在,则结果将为TRUE(当值为JSON null时)或FALSE(当存在非null JSON值时):

select  parse_json('{hello: NULL, world: 123}') as V,
        V:hello, 
        V:world,
        IS_NULL_VALUE(v:hello),
        IS_NULL_VALUE(v:world),
        IS_NULL_VALUE(v:goodbye),
        IFF(IS_NULL_VALUE(v:non_existing_key) is null, 'Key does not exist', 'Key exists'),
        IFF(IS_NULL_VALUE(v:hello) is null, 'Key does not exist', 'Key exists'),
        IFF(IS_NULL_VALUE(v:world) is null, 'Key does not exist', 'Key exists')
;

这假定一个扁平的变体结构。 - Mike Walton
是的...不确定确切的用例。IS_NULL_VALUE将确定是否存在预期的键,但无法告诉您它是否在JSON中以递归展平的方式出现。这是一个很好的方法,我将进行测试;感谢分享。 - Greg Pavlik

2
您可以简单地使用 OBJECT_KEYS 函数组合,输出 Variant 中仅存在的键的数组,并使用 ARRAY_CONTAINS 函数返回布尔值。请参见下文。
SELECT ARRAY_CONTAINS('<key_to_search_for>'::VARIANT, OBJECT_KEYS(<variant_column>))
FROM <table_name>;

2
如果您正在寻找一种在嵌套的JSON结构中查找可能很复杂的属性的方法,您可以运行类似于以下内容的代码:
SELECT COUNT(*)
FROM x
,LATERAL FLATTEN(parse_json(x.var), recursive => True) x2
WHERE x2.key = 'test';

这会将整个结构展平,并提供JSON中任何级别的所有可用键。如果计数为0,则不存在。如果运行直接选择而不是COUNT(*),它还会显示值,您可以确定属性在嵌套中的位置。

谢谢,这很聪明。 - Ollie Glass
x2 的目的是什么? - demircioglu
x2 只是 LATERAL FLATTEN 结果的别名。从技术上讲,我应该将其添加到键中以读取 WHERE x2.key = 'test'。我会进行编辑。 - Mike Walton
谢谢你的澄清,Mike。 - demircioglu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接