如何在 Snowflake 的列中提取我需要的单词?

How to pull out the word I need in a column in Snowflake?

所以我在table中有一列如下:

待定

JFK 257: Gremlin vs Ronald 2
JFK 271: Walter vs Hamburglar
JFK 272: Pizza vs Papa 1
JFK 272: Pizza vs Papa 2
JFK 267: 
JFK 275: Texas vs Cheese

并且我想提取 'vs' 一词周围的两个名称。

我想做的是生成一个新的 table 2 列,每个人都围绕着 vs。也就是说,只是 (Person1) 之前和 (Person2) 之后的单数词。

最终结果:

Person1  Person2
Gremlin  Ronald
Walter   Hamburglar
Pizza    Papa
Pizza    Papa
NA       NA
Texas    Cheese

可能有更简单的方法,但这个方法有效:

set term = 'JFK 257: Gremlin vs Ronald 2';

select   regexp_substr(trim(regexp_replace(split($TERM, 'vs')[0]::string, '\s', ' ')), '\b(\w+)$') as LEFT_NAME
        ,regexp_substr(trim(regexp_replace(split($TERM, 'vs')[1]::string, '\s', ' ')), '^([\w\-]+)') as RIGHT_NAME

另一种不使用正则表达式的方法。加载数据:

CREATE TABLE TEMP2 (CUSTOMER VARCHAR);
INSERT INTO TEMP2 VALUES
('JFK 257: Gremlin vs Ronald 2'),
('JFK 271: Walter vs Hamburglar'),
('JFK 272: Pizza vs Papa 1'),
('JFK 272: Pizza vs Papa 2'),
('JFK 267: '),
('JFK 275: Texas vs Cheese');

然后使用拆分部分获取冒号之后的数据,然后在 vs.

之前和之后再次获取数据

由于 person2 有一个额外的 space,我们需要获取 space 之前的所有内容。如果没有 space 我们将只取整个字符串。

WITH RAW_DATA AS (   
SELECT  TRIM(SPLIT_PART(SPLIT_PART(CUSTOMER, ':', 2), 'vs',1)) as person1_raw,
        TRIM(SPLIT_PART(SPLIT_PART(CUSTOMER, ':', 2), 'vs',2)) as person2_raw
     FROM TEMP2)
 SELECT person1_raw AS person_1,
        LEFT(person2_raw, case when position(' ', person2_raw) = 0 then length(person2_raw) else position(' ', person2_raw)  end ) as  person_2
    FROM RAW_DATA     ;  

结果:

PERSON_1 PERSON_2
Gremlin Ronald
Walter Hamburglar
Pizza Papa
Pizza Papa
Texas Cheese