我將展示基於字符串分割如圖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