Extract a substring with a specific pattern in MySql

I have a text box that looks like this:

option[A]sum[A]g3et[B]

I want to get the text that is inside [ ]without duplicates. Value:

A
B

There cannot be a double type case [ [ ] ].

I know this is a terrible way to store data in databases. I cannot change the way data is saved. I just need to get very specific (one-time) information from this column.

I tried to do:

SELECT substring_index(substring_index(sentence, '[', -1),']', 1)
FROM (SELECT 'THIS[A] IS A TEST' AS sentence) temp;

It gives me A, but it will not work for many [].

I was thinking about using regex, but I don't know how much [ ]I have.

How to do it?

+4
source share
1 answer

DB, :

CREATE TABLE tab(id INT, col VARCHAR(100));           
INSERT INTO tab(id, col) 
VALUES (1, 'option[A]sum[A]g3et[B]'), (2, '[Cosi]sum[A]g3et[ZZZZ]');      

SELECT DISTINCT *
FROM (
  SELECT id, RIGHT(val, LENGTH(val) - LOCATE('[', val)) AS val
  FROM
  (
    SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t.col, ']', n.n), ']', -1) AS val
    FROM tab t 
    CROSS JOIN 
    (
     SELECT a.N + b.N * 10 + 1 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
    ) n
    WHERE n.n <= 1 + (LENGTH(t.col) - LENGTH(REPLACE(t.col, ']', '')))
  ) sub
) s
WHERE val <> ''
ORDER BY ID;

SqlFiddleDemo

:

col CROSS JOIN. 100.

:

enter image description here

:

  • CROSS JOIN
  • ]
  • RIGHT(val, LENGTH(val) - LOCATE('[', val)) [
  • DISTINCT

:

╔════╦══════════╗
β•‘ id β•‘   val    β•‘
╠════╬══════════╣
β•‘  1 β•‘ option[A β•‘
β•‘  1 β•‘ sum[A    β•‘
β•‘  1 β•‘ g3et[B   β•‘
β•‘  1 β•‘          β•‘
β•šβ•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•

:

╔════╦═════╗
β•‘ id β•‘ val β•‘
╠════╬═════╣
β•‘  1 β•‘ A   β•‘
β•‘  1 β•‘ A   β•‘
β•‘  1 β•‘ B   β•‘
β•‘  1 β•‘     β•‘
β•šβ•β•β•β•β•©β•β•β•β•β•β•

:

╔════╦═════╗
β•‘ id β•‘ val β•‘
╠════╬═════╣
β•‘  1 β•‘ A   β•‘
β•‘  1 β•‘ B   β•‘
β•šβ•β•β•β•β•©β•β•β•β•β•β•

..

, :

WHERE n.n <= 1 + (LENGTH(t.col) - LENGTH(REPLACE(t.col, ']', '')))
  AND t.id = ?

2:

. http://sqlfiddle.com/#!9/8ee95/1 . longtext.

JSON MySQL. , . / .

SQL:

SELECT id, val,s.n
FROM (
  SELECT id, RIGHT(val, LENGTH(val) - LOCATE('[', val)) AS val,n
  FROM
  (
    SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t.col, ']', n.n), ']', -1) AS val, n.n
    FROM (SELECT id, REPLACE(col, '[]','') as col FROM tab) t
    CROSS JOIN 
    (
     SELECT e.N * 10000 + d.N * 1000 + c.N * 100 + a.N + b.N * 10 + 1 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
      ,(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) d
      ,(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) e

    ) n
    WHERE n.n <= 1 + (LENGTH(t.col) - LENGTH(REPLACE(t.col, ']', '')))
  ) sub
) s
WHERE val <> ''
GROUP BY id, val
HAVING n <> MAX(n)
ORDER BY id,n;

SqlFiddleDemo

:

╔═════╦═════════════╦════╗
β•‘ id  β•‘    val      β•‘ n  β•‘
╠═════╬═════════════╬════╣
β•‘  1  β•‘ CE31285LV4  β•‘  1 β•‘
β•‘  1  β•‘ D32E        β•‘  3 β•‘
β•‘  1  β•‘ GTX750      β•‘  5 β•‘
β•‘  1  β•‘ M256S       β•‘  7 β•‘
β•‘  1  β•‘ H2X1T       β•‘  9 β•‘
β•‘  1  β•‘ FMLANE4U4   β•‘ 11 β•‘
β•šβ•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•

3:

? n

CROSS JOIN, - . . MySQL (, generate_series , CROSS JOIN.

SUBSTRING_INDEX:

SUBSTRING_INDEX (, DELIM, )

str delim. , ( ). , ( ), SUBSTRING_INDEX() .

+5

All Articles