Snowflake - 根据 number/letters 拆分字符串
Snowflake - split a string based on number/letters
对于 A 列,示例值为
SRAB-123456-CRTCA-700042125
TRAB-B03456-CBAC-12342125
我想拆分这些值,这样它们就会变成
SRAB-123456
CRTCA-700042125
TRAB-B03456
CBAC-12342125
模式很棘手:每个部分(SRAB、123456、CRTCA 等)的长度是随机的。
只有一种模式是固定的:左边部分(SRAB、CRTCA、TRAB、CBAC 等)是一个只包含字母的字符串。但正确的部分可能是 letters/number.
我们可以在这里使用 SPLIT_PART
:
SELECT val
FROM
(
SELECT id, SPLIT_PART(a, '-', 1) || '-' || SPLIT_PART(a, '-', 2) AS val, 1 AS ord
UNION ALL
SELECT id, SPLIT_PART(a, '-', 3) || '-' || SPLIT_PART(a, '-', 4), 2
) t
ORDER BY id, ord;
我假设这里存在一些列 id
,它提供示例数据中的顺序,如图所示。如果不是,则可能无法按该顺序生成所需的输出。
可以用 SPLIT_TO_TABLE 完成(部分的数量可能会有所不同):
CREATE OR REPLACE TABLE tab
AS
SELECT 1 AS id, 'SRAB-123456-CRTCA-700042125' col
UNION
SELECT 2 AS id, 'TRAB-B03456_CBAC-12342125';
查询:
Actually the separator could be - or _
SELECT *
FROM tab
,LATERAL split_to_table(REPLACE(tab.col, '_', '-'), '-') s ;
输出:
编辑:
SELECT tab.id, tab.col, LISTAGG(s.VALUE, '-') WITHIN GROUP(ORDER BY s.index)
FROM tab
,LATERAL split_to_table(REPLACE(tab.col, '_', '-'), '-') s
GROUP BY tab.id, tab.col, SEQ, CEIL(INDEX/2);
输出:
编辑 2:
the table doesnt have ID column to show the order of each row,
代码仍然有效!
CREATE OR REPLACE TABLE tab
AS
SELECT 'SRAB-123456-CRTCA-700042125' col
UNION
SELECT 'TRAB-B03456_CBAC-12342125';
SELECT tab.col, LISTAGG(s.VALUE, '-') WITHIN GROUP(ORDER BY s.index) AS result
FROM tab
,LATERAL split_to_table(REPLACE(tab.col, '_', '-'), '-') s
GROUP BY tab.col, SEQ, CEIL(INDEX/2);
输出:
对于 A 列,示例值为
SRAB-123456-CRTCA-700042125
TRAB-B03456-CBAC-12342125
我想拆分这些值,这样它们就会变成
SRAB-123456
CRTCA-700042125
TRAB-B03456
CBAC-12342125
模式很棘手:每个部分(SRAB、123456、CRTCA 等)的长度是随机的。 只有一种模式是固定的:左边部分(SRAB、CRTCA、TRAB、CBAC 等)是一个只包含字母的字符串。但正确的部分可能是 letters/number.
我们可以在这里使用 SPLIT_PART
:
SELECT val
FROM
(
SELECT id, SPLIT_PART(a, '-', 1) || '-' || SPLIT_PART(a, '-', 2) AS val, 1 AS ord
UNION ALL
SELECT id, SPLIT_PART(a, '-', 3) || '-' || SPLIT_PART(a, '-', 4), 2
) t
ORDER BY id, ord;
我假设这里存在一些列 id
,它提供示例数据中的顺序,如图所示。如果不是,则可能无法按该顺序生成所需的输出。
可以用 SPLIT_TO_TABLE 完成(部分的数量可能会有所不同):
CREATE OR REPLACE TABLE tab
AS
SELECT 1 AS id, 'SRAB-123456-CRTCA-700042125' col
UNION
SELECT 2 AS id, 'TRAB-B03456_CBAC-12342125';
查询:
Actually the separator could be - or _
SELECT *
FROM tab
,LATERAL split_to_table(REPLACE(tab.col, '_', '-'), '-') s ;
输出:
编辑:
SELECT tab.id, tab.col, LISTAGG(s.VALUE, '-') WITHIN GROUP(ORDER BY s.index)
FROM tab
,LATERAL split_to_table(REPLACE(tab.col, '_', '-'), '-') s
GROUP BY tab.id, tab.col, SEQ, CEIL(INDEX/2);
输出:
编辑 2:
the table doesnt have ID column to show the order of each row,
代码仍然有效!
CREATE OR REPLACE TABLE tab
AS
SELECT 'SRAB-123456-CRTCA-700042125' col
UNION
SELECT 'TRAB-B03456_CBAC-12342125';
SELECT tab.col, LISTAGG(s.VALUE, '-') WITHIN GROUP(ORDER BY s.index) AS result
FROM tab
,LATERAL split_to_table(REPLACE(tab.col, '_', '-'), '-') s
GROUP BY tab.col, SEQ, CEIL(INDEX/2);
输出: