在Snowflake中提取XML数据

在Snowflake中提取XML数据,xml,snowflake-cloud-data-platform,Xml,Snowflake Cloud Data Platform,我有一个TEST_XML表,它有一个变量列SRC_XML,其中包含以下XML。当我试图提取问题文本和答案文本时,结果是NULL,即使XML在相应的字段中有值 <DATA_EXPORT> <HEADER> <ENTRY_DATE> <START>2021-04-02</START> <END>2021-04-02</END> </ENTRY_DATE>

我有一个TEST_XML表,它有一个变量列SRC_XML,其中包含以下XML。当我试图提取问题文本和答案文本时,结果是NULL,即使XML在相应的字段中有值

<DATA_EXPORT>
  <HEADER>
    <ENTRY_DATE>
      <START>2021-04-02</START>
      <END>2021-04-02</END>
    </ENTRY_DATE>
    <QUESTION_COUNT>225</QUESTION_COUNT>
    <SURVEY_QUESTIONS>
      <QUESTION>
        <NUMBER>1</NUMBER>
        <QUESTION_TEXT>DO YOU TRAVEL?</QUESTION_TEXT>
        <ANSWER_TEXT>NO</ANSWER_TEXT>
      </QUESTION>
      <QUESTION>
        <NUMBER>2</NUMBER>
        <QUESTION_TEXT>HOW MANY LANGUAGES DO YOU SPEAK?</QUESTION_TEXT>
        <ANSWER_TEXT>6</ANSWER_TEXT>
      </QUESTION>
    </SURVEY_QUESTIONS>
  </HEADER>
</DATA_EXPORT>
我期望的输出是

问题编号 问题: 答复 1. 你旅行吗? 不 2. 你会说多少种语言? 6.
因此,将SQL放入扁平化并将它们分开,我们可以看到

  SELECT 
    XMLGET(SRC_XML, 'HEADER', 0) as h
    ,XMLGET(h,'SURVEY_QUESTIONS') as sq
   ,GET(sq, '$') as parts
   ,d.*
  FROM TEST_XML,
  LATERAL FLATTEN(GET(XMLGET(XMLGET(SRC_XML, 'HEADER', 0),'SURVEY_QUESTIONS'), '$'))D;
你的h sq和零件都是正确的。但是你的问题,你称之为
q
是实际的障碍,所以你不需要把它分开

因此,您想要使用的是:

SELECT 
    GET(XMLGET(D.VALUE, 'NUMBER'), '$') AS QUESTION_NUMBER
    , GET(XMLGET(D.VALUE, 'QUESTION_TEXT'), '$') AS QUESTION
    , GET(XMLGET(D.VALUE, 'ANSWER_TEXT'), '$') AS ANSWER
FROM TEST_XML,
LATERAL FLATTEN(GET(XMLGET(XMLGET(SRC_XML, 'HEADER', 0),'SURVEY_QUESTIONS'), '$'))D;
其中:

QUESTION_NUMBER QUESTION                      ANSWER
1        "DO YOU TRAVEL?"                     "NO"
2        "HOW MANY LANGUAGES DO YOU SPEAK?"    6 

@LukaszSzozda-Am仍然在所有行和列上获取空值。你能帮我回答这个问题吗?请道歉。我不明白它是怎么工作的,尤其是横向连接。你太棒了!我原以为你会帮忙,你回答得很好。你的解决方案奏效了。非常感谢:)我知道$获取特定标记的内容,@获取标记名。横向压扁是如何工作的?我浏览了文档,但是当我遇到复杂的XML层次结构时,我感到困惑。你能帮我理解吗?@vvazza flatte采用类似数组的方式,并使用“数组”中的子对象加上一些其他元值生成一行新数据,这可以根据你正在执行的任务来帮助你。因此,在您的数据中,您在
标题、调查问题
之间循环,每个问题都作为一行SQL输出,因此您可以访问
测试XML
中的任何内容以及
D
的当前项中的任何内容。基本上,flatte与Javascript或C中的FOREACH相同,谢谢!我想我已经开始理解,以及如何从你对我的两个问题的回答中查看数据。如果我有更多的问题,我会回来的:)谢谢,再一次
QUESTION_NUMBER QUESTION                      ANSWER
1        "DO YOU TRAVEL?"                     "NO"
2        "HOW MANY LANGUAGES DO YOU SPEAK?"    6