雪花中 XML 横向展平的意外行为(具有 1 个值的行被过滤)

Unexpected Behavior with XML Lateral Flatten In Snowflake (Rows with 1 value being filtered)

我正在 Snowflake 中处理一些 XML 数据,我试图访问 XML 子节点中的一些数据。

我得到的数据是这样的:

<Employee>
     <EmploymentStatuses>
        <EmployeeEmploymentStatus>
            <OtherInformation>
            </OtherInformation>            
        </EmployeeEmploymentStatus>
</Employee>

对于给定的员工,他们可能有多个 'EmployeeEmploymentStatus'。

为了解决这个问题,我创建了一个如下所示的视图:

SELECT
  XMLGET(XML_CONTENT,'EMPLOYEE_CODE'):"$"::STRING AS EMPLOYEE_CODE
  , XMLGET(EMPLOYMENT_STATUS.value, 'EffectiveStart'):"$"::DATE AS EffectiveStart
...........
FROM
  XML_FILE
  LATERAL FLATTEN(XML_CONTENT:"$") STATUSES
  LATERAL FLATTEN(STATUS.VALUE:"$") EMPLOYMENT_STATUS
WHERE 
 GET(STATUSES.VALUE, '@') = 'EmploymentStatuses'
AND GET(EMPSTAT.VALUE, '@') = 'EmployeeEmploymentStatus'

我 运行 遇到的问题是,虽然这在员工有多个 'EmploymentStatus' 的情况下看起来很完美,但如果他们只有一个,则会将其过滤掉。 (即,任何拥有 2 个或更多就业身份的人都会像您预期的那样显示他们的所有身份,但只有 1 个就业身份的人根本不会出现)

如果我删除第二个横向展平并仅在 select 部分使用嵌套 XMLGET,我可以 return 该值,但对于具有多个 'EmploymentStatus' 它只是 return 第一个值。

查看 STATUSES.VALUE 的输出时,它们在格式方面看起来完全相同并且具有所有相同的标签。

我唯一能想到的基本上就是将这两个表合并,或者做一些像修改'where语句这样的事情,然后需要在所有字段上合并语句:

GET(EMPLOYMENT_STATUS.value, '@') = 'EmployeeEmploymentStatus' OR GET(STATUSES.value:"$",'@')::STRING = 'EmployeeEmploymentStatus')

我测试了这个方法,它似乎有效,但它也似乎有点笨拙和不直观。

如有任何建议,我们将不胜感激。

这是 XML 库中的一个常见错误(因此它不仅仅是雪花问题), 是获取您知道可以是数组的节点,并将其转换为在进行 spilt 之前的数组,以便它始终有效。

喜欢:

lateral flatten(to_array(xmlget(xmlget(src2.cdc_xml, 'portfolio'))))

IFF(IS_ARRAY(master_raw), master_raw, TO_ARRAY(master_raw)) as master