如何使用SPLIT函数提取多组产品信息中的首项内容?
如何提取分号分隔字符串中每组的首个元素
单纯嵌套SPLIT函数没法直接实现需求,因为嵌套后会把所有逗号分割的元素扁平化,没法对应到原分号分隔的每组。但结合数组遍历/拆分函数,还是可以用SPLIT配合其他函数完成,下面按不同SQL方言给出具体实现:
MySQL 8.0+
方法1:JSON_TABLE + SUBSTRING_INDEX
先把原字符串转成JSON数组,拆分单行后提取每组首个元素,最后拼接:
SELECT GROUP_CONCAT( SUBSTRING_INDEX(item, ',', 1) SEPARATOR ',' ) AS result FROM ( SELECT JSON_TABLE( CONCAT('["', REPLACE(your_column, ';', '","'), '"]'), '$[*]' COLUMNS(item VARCHAR(255) PATH '$') ) AS items FROM your_table ) AS sub;
方法2:递归CTE拆分
适合不想用JSON函数的场景:
WITH RECURSIVE split_cte AS ( SELECT 1 AS idx, SUBSTRING_INDEX(your_column, ';', 1) AS item, SUBSTRING(your_column, LENGTH(SUBSTRING_INDEX(your_column, ';', 1)) + 2) AS rest FROM your_table UNION ALL SELECT idx + 1, SUBSTRING_INDEX(rest, ';', 1), SUBSTRING(rest, LENGTH(SUBSTRING_INDEX(rest, ';', 1)) + 2) FROM split_cte WHERE rest != '' ) SELECT GROUP_CONCAT(SUBSTRING_INDEX(item, ',', 1) SEPARATOR ',') AS result FROM split_cte;
PostgreSQL
用STRING_TO_ARRAY拆分数组,UNNEST展开后提取首个元素:
SELECT STRING_AGG(SPLIT_PART(item, ',', 1), ',' ) AS result FROM your_table, UNNEST(STRING_TO_ARRAY(your_column, ';')) AS item;
也可以用正则匹配提取每组首个部分:
SELECT STRING_AGG(SUBSTRING(item FROM '^[^,]*'), ',' ) AS result FROM your_table, UNNEST(STRING_TO_ARRAY(your_column, ';')) AS item;
BigQuery
拆分数组后遍历每个元素提取首个部分,再拼接成字符串:
SELECT ARRAY_TO_STRING( ARRAY(SELECT SPLIT_PART(x, ',', 1) FROM UNNEST(SPLIT(your_column, ';')) x), ',' ) AS result FROM your_table;
为什么你之前的写法失败?
SPLIT(SPLIT(your_column,';'),',')会把分号拆分后的每个子字符串再按逗号拆分,最终得到一个扁平化的数组(比如示例中会变成["A","1","B","2","C3","D","4"]),无法对应原分号分隔的每组,自然取不到每组的首个元素。
内容的提问来源于stack exchange,提问作者ozlem
相关产品推荐
相关产品推荐

