在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