在MySQL中提取子字符串
假设我有一个随机字符字符串,里面有带引号的字符串,如下所示:在MySQL中提取子字符串,mysql,sql,regex,string,Mysql,Sql,Regex,String,假设我有一个随机字符字符串,里面有带引号的字符串,如下所示: "FOO,BAR,BAZ,ALPHA100,ALPHA500,BRAVO250" a:15:i:0s:3:“FOO”i:1s:3:“BAR”i:2s:3:“BAZ”i:3s:3:“ALPHA100”i:4s:3:“ALPHA500”i:5s:3:“BRAVO250”i:6s:3 我想匹配里面带引号的字符串,它总是包含三个大写字母或五个大写字母后跟三个数字。在JavaScript中,我可以做到这一点: " the string ".m
"FOO,BAR,BAZ,ALPHA100,ALPHA500,BRAVO250"
a:15:i:0s:3:“FOO”i:1s:3:“BAR”i:2s:3:“BAZ”i:3s:3:“ALPHA100”i:4s:3:“ALPHA500”i:5s:3:“BRAVO250”i:6s:3
我想匹配里面带引号的字符串,它总是包含三个大写字母或五个大写字母后跟三个数字。在JavaScript中,我可以做到这一点:
" the string ".match(/"([A-Z]{3}|[A-Z]{5}\d{3})"/g);
我已经研究了MySQL的操作符,但这似乎只适用于条件子句
理想情况下,我希望选择所有字符串,删除引号,然后执行GROUP\u CONCAT
,以返回一行的最终结果集,如下所示:
"FOO,BAR,BAZ,ALPHA100,ALPHA500,BRAVO250"
理想情况下,我希望在数据库级别执行此操作,以避免下载所有字符串并通过我的单行JavaScript程序运行它们。我将显示一个基于字符串拆分的函数,如中所示
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 ;
表情
1 + LENGTH(myString) - LENGTH(REPLACE(myString, '"', ''))
提供零件的计数,因为它比分隔符的引用多出一个引用
选择所需零件
我们使用regexp
'^([A-Z]{3}|[A-Z]{5}[0-9]{3})$'
因为我们的部分必须完全匹配已知的regexp,从开始到结束,没有更多的内容
串联
最后,我们使用带有默认分隔符逗号的GROUP_CONCATE来获得所需的结果
评论
我已经建立了一个
您可以轻松地修改此功能以满足您的需要。你真的喜欢这个吗?我建议您使用一行javascript。这种表单的文本处理并不是关系数据库的最佳功能。这当然是一个很好的功能,但我想我会继续使用我的JavaScript代码:-p