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);

输出: