将基于分隔符的行拆分为新行 - SQL

Split delimiter based rows in to new rows - SQL

我有以下数据,我想通过分隔符将每一行拆分为新行。

示例数据:

**Row No. | Data**
        1 | abc,pqr,lmn,omr
        2 | aaa,bbb,ccc,ddd

输出应该是:

**Row No. | Data**
        1 | abc
        2 | pqr
        3 | lmn
        4 | omr
        5 | aaa
        6 | bbb
        6 | ccc
        6 | ddd

我有以下代码片段,但它只适用于第一行。

    SELECT * EXCEPT(c) REPLACE(c AS col) 
    FROM `project.dataset.table`, 
    UNNEST(SPLIT(col)) c;

使用以下内容:

WITH myData AS (
  select 
    id, 
    values
    FROM 
      UNNEST([
        STRUCT<id int, values string>(1, 'abc,pqr,lmn,omr'),
        STRUCT<id int, values string>(2, 'aaa,bbb,ccc,ddd')
      ])
)
SELECT 
  id,
  data
FROM myData,
UNNEST(SPLIT(values, ',')) AS data
ORDER BY id ASC

我首先使用您的测试数据创建一个临时示例 table。你正在寻找的要点在最后。您在正确的轨道上使用 UNNEST 将数组的元素分解为单独的行,但是您缺少 SPLIT 函数来实际通过逗号分隔字符串中的各个值分隔符。

此查询产生以下结果:

id data
1 abc
1 pqr
1 lmn
1 omr
2 aaa
2 bbb
2 ccc
2 ddd

并且只是对此进行了调整 - 如果您只是想要一个单调递增的数字作为 ID,而不是像它在那里那样重复(例如,不需要 link 返回到 ID),请更新您的查询以下内容:

WITH myData AS (
  select 
    id, 
    values
    FROM 
      UNNEST([
        STRUCT<id int, values string>(1, 'abc,pqr,lmn,omr'),
        STRUCT<id int, values string>(2, 'aaa,bbb,ccc,ddd')
      ])
)
SELECT ROW_NUMBER() OVER() AS id,
  data
FROM myData,
UNNEST(SPLIT(values, ',')) AS data
ORDER BY id ASC

在这里,我只是放弃了 SELECT 表达式中 id 字段的使用,并替换为递增的行号,该行号在数据集中的所有记录上递增。这会产生以下结果:

id data
1 abc
2 pqr
3 lmn
4 omr
5 aaa
6 bbb
7 ccc
8 ddd