如何在 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
所以我在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 |