json - Snowflake-如何在不使用硬编码键的情况下搜索 json 值中的值

标签 json snowflake-cloud-data-platform hardcode

我有一个 json 列,其中包含从 d1 到 d32 的键,这些键具有特定的值。 我现在想查询任何键中都不存在值的行。

Like - 任何不等于 abc 的维度。 所以我正在检查 d1!=abc 或 d2!=abc..... d32!=abc。 有更好的方法吗?

每一行都是一个json字段,包含d1-d32维度及其对应值的任意组合

最佳答案

使用 flatten(),您可以获得 json 中每个键的名称和值:

with variants as (
select 1 id, parse_json('{"d1":1, "d2":2, "d3":3}') data
union all select 2, parse_json('{"d1":4, "d2":5, "d3":7}') 
union all select 3, parse_json('{"d1":2, "d2":0, "d3":0}') 
)

select * 
from variants, table(flatten(data));
;

enter image description here

根据该信息,您可以查看所有名为 d% 的键并查找其中不存在的值 - 比方说 2:

with variants as (
select 1 id, parse_json('{"d1":1, "d2":2, "d3":3}') data
union all select 2, parse_json('{"d1":4, "d2":5, "d3":7}') 
union all select 3, parse_json('{"d1":2, "d2":0, "d3":0}') 
)

select id, not boolor_agg((iff(key like 'd%', value=2, true))) doesnt_have_a_2
from variants, table(flatten(data))
group by id
;

enter image description here

这表明 id=2 的行是唯一没有键值 2 的行。

作为替代方案,您还可以在 where 子句中过滤键名而不是 iff:

with variants as (
select 1 id, parse_json('{"d1":1, "d2":2, "d3":3}') data
union all select 2, parse_json('{"d1":4, "d2":5, "d3":7}') 
union all select 3, parse_json('{"d1":2, "d2":0, "d3":0}') 
)

select id, boolor_agg(value=2) 
from variants, table(flatten(data))
where key like 'd%'
group by id
;

关于json - Snowflake-如何在不使用硬编码键的情况下搜索 json 值中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65653451/

相关文章:

json - 解码编码不佳的 JSON(嵌套过多、许多可能的键、键与值混淆)

javascript - 从 Javascript 解析 JSON 时如何保持顺序?

java - JsonArray 错误 : org. json.JSONException:找不到 JSONArray[1]

regex - Posix Regex 的负向后查找解决方法

php - 在两个表和 ID 中搜索查询

java - 如何将 Spring MVC 的默认媒体类型从 XML 更改为 JSON

aws-lambda - Snowflake 的异步外部函数不遵守 HttpStatus 429

sql - 雪花: ListAgg data based on condition

android - 如何不对我的密码进行硬编码(Android)?