[英]MySQL extract several substrings in SELECT, an arbitrary number of times
[英]Extract substrings in MySQL
假設我有一串隨機字符,其中帶有引號的字符串是這樣的:
一個:15:I:0:3: “FOO” 我:1秒:3: “BAR” 我:2S:3: “BAZ” 我:3秒:3: “ALPHA100” 我:4S:3: “ALPHA500” 我:5秒:3: “BRAVO250” 我:6S:3
我想匹配帶引號的字符串,該字符串始終包含三個大寫字母或五個大寫字母后跟三個數字。 在JavaScript中,我可以這樣做:
" the string ".match(/"([A-Z]{3}|[A-Z]{5}\d{3})"/g);
我已經研究了MySQL的REGEXP
運算符,但這似乎僅適用於條件子句。
理想情況下,我想選擇所有字符串,剪掉引號,然后執行GROUP_CONCAT
來獲得像這樣的一行的最終結果集:
"FOO,BAR,BAZ,ALPHA100,ALPHA500,BRAVO250"
理想情況下,我想在數據庫級別執行此操作,以避免下載所有字符串並通過我的一行JavaScript程序運行它們。
我將展示一個基於字符串拆分的函數,如SQL拆分值所示,將其拆分為多個要使用的行
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與默認分隔符(逗號)一起使用,以獲得所需的結果。
我已經建立了一個演示 。
您可以輕松修改此功能以滿足您的需求。
你真的喜歡這個嗎? 我建議使用您的單行javascript。 這種形式的文本處理並不是關系數據庫最好的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.