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,
...
我的列是由逗号分隔的一串值(没有特定顺序):
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,
...