簡體   English   中英

在MySQL中提取子字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM