雪花中 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
我正在 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 库中的一个常见错误(因此它不仅仅是雪花问题),
喜欢:
lateral flatten(to_array(xmlget(xmlget(src2.cdc_xml, 'portfolio'))))
或
IFF(IS_ARRAY(master_raw), master_raw, TO_ARRAY(master_raw)) as master