将单行值拆分为 Snowflake 中的多行

Split single row value to multiple rows in Snowflake

我有一个 table,其中列数据包含由“;”分隔的值组合。我想将它们拆分为每个列值的行。

Table 数据

现在我想为每个值将它们分成多行,例如

我试过使用下面的 SQL 语句。

SELECT DISTINCT COL_NAME FROM "DB"."SCHEMA"."TABLE,
LATERAL FLATTEN(INPUT=>SPLIT(COL_NAME,';'))

但是输出并不像预期的那样。在下面附加查询输出。

基本上查询对我的数据没有任何影响。

可以使用SPLIT_TO_TABLEtable函数实现:

This table function splits a string (based on a specified delimiter) and flattens the results into rows.

SELECT * 
FROM tab, LATERAL SPLIT_TO_TABLE(column_name, ';')

我能够通过像加入 table 一样使用 LATERAL FLATTERN 并从中选择值来解决这个问题。

SELECT DISTINCT A.VALUE AS COL_NAME 
FROM "DB"."SCHEMA"."TABLE", 
LATERAL SPLIT_TO_TABLE(COL_NAME,';')A

看起来您的数据有多个分隔符,我们可以利用 STRTOK_SPLIT_TO_TABLE 使用多个分隔符的函数..

STRTOK_SPLIT_TO_TABLE

 WITH data AS (
 SELECT *
    FROM VALUES
           ('Greensboro-High Point-Winston-Salem;Norfolk-Portsmouth-Newport News Washington, D.C. Roanoke-Lynchburg Richmond-Petersburg')
              v( cities))
select * 
    from data, lateral strtok_split_to_table(cities, ';-')
    order by seq, index;

结果:

您的第一次尝试非常接近,您只需要访问展平的输出,而不是展平的输入

因此将此 CTE 用于数据:

 WITH fake_data AS (
    SELECT *
    FROM VALUES
    ('Greensboro-High Point-Winston-Salem;Norfolk-Portsmouth-Newport News;Washington, D.C.;Roanoke-Lynchburg;Richmond-Petersburg'),
    ('Knoxville'),
    ('Knoxville;Memphis;Nashville')
    v( COL_NAME)
 )

如果您为表设置了别名,并访问了这些部分。

 SELECT DISTINCT f.value::text as col_name
 FROM fake_data d,
    LATERAL FLATTEN(INPUT=>SPLIT(COL_NAME,';')) f
;

这是您在提供的答案中所做的,但是通过 SPLIT_TO_TABLE

 SELECT DISTINCT f.value as col_name
 FROM fake_data d,
    TABLE(SPLIT_TO_TABLE(COL_NAME,';')) f
;

STRTOK_SPLIT_TO_TABLE也是一样的:

 SELECT DISTINCT f.value as col_name
 FROM fake_data d,
    TABLE(strtok_split_to_table(COL_NAME,';')) f
;

这也可以通过 strtok_to_array 和 FLATTEN that

来完成
 SELECT DISTINCT f.value as col_name
 FROM fake_data d,
    TABLE(FLATTEN(input=>STRTOK_TO_ARRAY(COL_NAME,';'))) f
;
COL_NAME
Greensboro-High Point-Winston-Salem
Norfolk-Portsmouth-Newport News
Washington, D.C.
Roanoke-Lynchburg
Richmond-Petersburg
Knoxville
Memphis
Nashville