将单行值拆分为 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 使用多个分隔符的函数..
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
我有一个 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 使用多个分隔符的函数..
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 |