创建一个新列,其中包含另一列的子字符串列表

时间:2019-01-16 16:11:13

标签: sql amazon-redshift

我有下表,分别是“ Column1”,“ Column2”和“ Column3”

Column1                                 Column2  Column3
ABC - Loading                              22   3815
ABC - Loading of Page                      49   5131
Enter -CDE - Any action with target        74   2798
Exit -CDE - Any action with target2        35   3351
ACE Wireless - loading1                    12   9910
All -ACE Wireless - Click1                 49   6060
GATE - click or touch on egh               76   6061
GATE - click or touch on plans             100  6020
HUB - loading of def                       90   4854
All -HUB - Click or Touch on poe           82   2754

我需要创建“ NewColumn”,在其中我需要从列表(CDE,ACE,GATE,HUB)中提取特定的字符串,并针对“ Column1”进行查找,如下所示:

Column1                                 Column2  Column3  NewColumn
ABC - Loading                              22   3815        ABC
ABC - Loading of Page                      49   5131        ABC
Enter -CDE - Any action with target        74   2798        CDE
Exit -CDE - Any action with target2        35   3351        CDE
ACE Wireless - loading1                    12   9910        ACE
All -ACE Wireless - Click1                 49   6060        ACE
GATE - click or touch on egh               76   6061        GATE
GATE - click or touch on plans             100  6020        GATE
HUB - loading of def                       90   4854        HUB
All -HUB - Click or Touch on poe           82   2754        HUB

请注意,查询的关键字不会重复。

我尝试了各种命令,例如EXTRACT,SUBSTRING等。但是我看过的所有命令都不适合我的特定要求。

我正在RedShift SQL中寻找有关如何使用列表创建“ NewColumn”的指南,该列表从“ Column1”中查找关键字。

1 个答案:

答案 0 :(得分:1)

这将找到与问题列表中的一个值匹配的第一个匹配项。

select
    Column1,
    Column2,
    Column3,
    regexp_substr(Column1, 'CDE|ACE|GATE|HUB') AS NewColumn
from
    your_table;

编辑: 以容纳@TimBiegeleisen

select
    Column1,
    Column2,
    Column3,
    regexp_substr(
        Column1,
        (SELECT LIST_AGG(item, '|') FROM table_of_codes)
    ) AS NewColumn
from
    your_table;

或者...

select
    your_table.Column1,
    your_table.Column2,
    your_table.Column3,
    table_of_codes.item
from
    your_table
inner join
    table_of_codes
        on yourTable.col3 LIKE '%' + table_of_codes.item + '%'
;

或许多这样的变体。

(表table_of_codes在每个要搜索的代码中包含一行。)