SQL 服务器从逗号分隔的字符串中提取某些值

SQL Server extract certain values from a string separated by a comma

我的列是由逗号分隔的一串值(没有特定顺序):

event_list

2,100,101,102,103,104,105,106,110,114,121,126,152,185,191,524,150,198,158,111,20
100,101,102,103,104,110,114,121,126,152,175,185,191,150,198,158,111,123,10091

我只对1,2,10,11,12,13,14和20感兴趣,其他的无关紧要。例如 2 - “产品视图”和 12 - “添加到购物车”。

所以我正在尝试做类似

的事情
CASE WHEN 2 IN event_list THEN 1 ELSE 0 END as product_view flag,
CASE WHEN 12 IN event_list THEN 1 ELSE 0 END as add_to_cart_flag
...

但是因为它是 SQL 而不是 Python,我认为以上不可能,因此试图弄清楚如何去做。而且我认为使用正则表达式不会有帮助,因为“120”也会包含“2”。

STRING_SPLIT 不是最佳解决方案,因为数据已经是 9000 亿行。

有几种方法是

SELECT *
FROM YourTable yt
CROSS APPLY
(
SELECT 
        MAX(CASE WHEN value = '2' THEN 1 ELSE 0 END)  as product_view_flag,
        MAX(CASE WHEN value = '12' THEN 1 ELSE 0 END)  as add_to_cart_flag
FROM STRING_SPLIT(yt.event_list, ',')
) ca

SELECT yt.*, 
            CASE WHEN adj_event_list LIKE '%,2,%' THEN 1 ELSE 0 END as product_view_flag, 
            CASE WHEN adj_event_list LIKE '%,12,%' THEN 1 ELSE 0 END as add_to_cart_flag
FROM YourTable yt
CROSS APPLY (SELECT CONCAT(',',yt.event_list,',')) CA(adj_event_list)

如果您实际上 运行 这在 9000 亿行上都会很慢。我猜不出哪个会“赢”——你需要同时测试两者。

实际上一切都变得更容易,而且性能也很好。

CASE WHEN event_list LIKE '2,%' OR event_list LIKE '%,2,%' OR event_list LIKE '%,2' 
THEN 1 ELSE 0 END AS product_view_flag,
CASE WHEN event_list LIKE '12,%' OR event_list LIKE '%,12,%' OR event_list LIKE '%,12' 
THEN 1 ELSE 0 END AS cart_view_flag,
...