我将展示基于字符串分割如图SQL split values to multiple rows像
SELECT get_the_parts(theString) FROM example;
此功能要使用的功能的作用类似于此: - 采用双分割字符串成表零件引号作为定界符 - 仅选择严丝合缝3大写字母或5个大写字母随后三位数字 那些部件 - 串接的选定部分与逗号作为隔板
DELIMITER //
CREATE FUNCTION get_the_parts(myString VARCHAR(2000)) RETURNS VARCHAR(2000)
BEGIN
DECLARE result VARCHAR(2000);
SELECT
GROUP_CONCAT(t.value) INTO result
FROM (
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(e.col, '"', n.n), '"', -1) value
FROM (SELECT myString AS col) e
CROSS JOIN (
-- creates a numbers table with the values from 1 to 1,000 on the fly
SELECT
1 + a.N + b.N * 10 + c.N * 100 AS n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c
ORDER BY n
) n
WHERE
n.n <= 1 + LENGTH(myString) - LENGTH(REPLACE(myString, '"', ''))
) t
WHERE
t.value REGEXP '^([A-Z]{3}|[A-Z]{5}[0-9]{3})$';
return result;
END //
DELIMITER ;
说明
创建一个数字表
与UNION ALL
最里面的子查询中从1飞了一个数字表,数字到1000这个子查询可以创建一个数字表在你的数据库很容易取代。
分割字符串
随着SUBSTRING_INDEX一个嵌套调用我们削减在隔板之间的第n个串。我们使用双引号作为分隔符:
SUBSTRING_INDEX(SUBSTRING_INDEX(e.col, '"', n.n), '"', -1)
表达
1 + LENGTH(myString) - LENGTH(REPLACE(myString, '"', ''))
给了我们部分的数量,因为它是一个发生率比隔膜的出现了。
选择所需的部分
我们使用正则表达式
'^([A-Z]{3}|[A-Z]{5}[0-9]{3})$'
,因为我们的部分已经得到了从一开始就^
已知的正则表达式完全匹配,直到最后$
无需更多的内容。
串联
最后,我们使用GROUP_CONCATE使用默认的分隔符,逗号,以获得期望的结果。
备注
我已经建立了一个Demo。
您可以轻松修改此功能以满足您的需求。
你真的喜欢这个吗?我会建议使用你的单行javascript。这种形式的文本处理并不是真正关系数据库最好的。
这当然是相当的功能,但我想我会坚持我的JavaScript代码行:-P – 2014-09-30 06:20:18