如何读取具有多个共享相同 属性 名称的值的 SUPER 数据类型值?

How to read a SUPER data-type value with multiple values sharing the same property names?

我的 redshift 数据库中有一个字段 SUPER type:

它包含

{
    "Order": {
      "OrderNumber": "Ab1234ZX",
      "ReasonDelay": "No reason",
      "ReasonDelay": false
    }
}

问题是我有两个名称相同 (ReasonDelay) 但值不同 ("No reason"false) 的属性。

select 
    e.contents."Order"."ReasonDelay" as first_reason,
    e.contents."Order"."ReasonDelay" as second_reason
from
    orders e

显然给了我相同的结果。使用 [0][1](显然)什么都不做:

select 
    e.contents."Order"[0]."ReasonDelay" as first_reason,
    e.contents."Order"[1]."ReasonDelay" as second_reason
from
    orders e
select 
    e.contents."Order"."ReasonDelay"[0] as first_reason,
    e.contents."Order"."ReasonDelay"[1] as second_reason
from
    orders e

如何查询?

您正在处理 json 和 PartiQL 中模棱两可的极端情况。我的建议是尽早消除数据处理中的歧义。不同的工具将以不同的方式处理这种情况,并且同一工具可以自由地更改它们跨版本处理这种情况的方式。即使您今天找到了让它正常工作的方法,您也可能没有长期的可靠数据解决方案,而不仅仅是 Redshift。

现在,如果您想消除 Redshift 中的数据歧义(不是我推荐这样做的地方),您可以编写一个 regexp_replace 来更改您的字符串

{
    "Order": {
      "OrderNumber": "Ab1234ZX",
      "ReasonDelay": "No reason",
      "ReasonDelay": false
    }
}

{
    "Order": {
      "OrderNumber": "Ab1234ZX",
      "ReasonDelay": ["No reason", false]
    }
}

例如。显然,这需要作为文本完成,然后转换为 super。这种方法的问题是它将依赖于文本格式,而且也不是很健壮。

我认为最好的答案是在源头或尽早在管道中修复数据。