Това не е работа за DB
но е възможно:
раздел СЪЗДАВАНЕ НА ТАБЛИЦА(id INT, col VARCHAR(100)); INSERT INTO tab(id, col) VALUES (1, 'опция[A]sum[A]g3et[B]'), (2, '[Cosi]sum[A]g3et[ZZZZ]'); SELECT DISTINCT *FROM ( SELECT id, RIGHT(val, LENGTH(val) - LOCATE('[', val)) КАТО val FROM ( SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t.col, ']', n.n), '] ', -1) AS val ОТ раздел t КРЪСТО ПРИСЪЕДИНЕНИЕ ( ИЗБЕРЕТЕ a.N + b.N * 10 + 1 n ОТ (ИЗБЕРЕТЕ 0 КАТО 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 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) sWHERE val <> ''ПОРЪЧАЙ ПО ИД;
Забележка:
В зависимост от col
максимална дължина, от която може да се нуждаете, за да генерирате повече числа в CROSS JOIN
раздел. Засега е до 100.
Изход:
Как работи:
- Генерирайте таблица с числа с
CROSS JOIN
- Разделяне на низ въз основа на
]
като разделител RIGHT(val, LENGTH(val) - LOCATE('[', val))
премахнете частта до[
- филтрирайте празните записи
- Вземете само
DISTINCT
стойности
Най-вътрешна заявка:
╔════╦══════════╗║ id ║ val ║╠═════════════════╗║ id ║ val ║╠═══════════════════════════════╬═════════════════║ A ║║ 1 ║ sum[A ║║ 1 ║ g3et[B ║║ 1 ║ ║╚════╩════════════════════════
Втора подзаявка:
<предварителен код>╔════╦═════╗║ id ║ val ║╠════╬═════════════════════════════╣║ ║ ║ ║ ║ ║ 1 ║ 1 ║ ║╚════╩═════╝И най-външната заявка:
╔════╦═════╗║ идентификатор ║ val ║╠════╬═══════════════════════════════════╣║ ║ ║ ║ ══║║ 1 ╩═════╝
Така че добавете просто:
КЪДЕ n.n <=1 + (LENGTH(t.col) - LENGTH(REPLACE(t.col, ']', ''))) И t.id =?
РЕДАКТИРАНЕ 2:
Искате да анализирате JSON в MySQL. Както казах преди, анализирайте и получете стойност в слоя на приложението. Този отговор е само за целите на демонстрация/играчки и ще има много ниска производителност.
Ако все още настоявате за SQL решение:
SELECT id, val,s.nFROM ( SELECT id, RIGHT(val, LENGTH(val) - LOCATE('[', val)) КАТО val,n FROM ( SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t) .col, ']', n.n), ']', -1) КАТО val, n.n ОТ (ИЗБЕРЕТЕ идентификатор, ЗАМЕНЕТЕ(col, '[]','') като столбец ОТ раздел) t КРЪСТО ПРИЕДИНЯВАНЕ (ИЗБЕРЕТЕ e.N * 10000 + d.N * 1000 + c.N * 100 + a.N + b.N * 10 + 1 n ОТ (ИЗБЕРЕТЕ 0 КАТО N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 6 UNION ALL SELECT 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 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 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c ,(ИЗБЕРЕТЕ 0 КАТО N СЪЕДИНЕНИЕ ВСИЧКИ ИЗБЕРЕТЕ 1 СЪЕДИНЕНИЕ ВСИЧКИ ИЗБОР 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 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 КЪДЕ n.n <=1 + (LENGTH(t.col) - LENGTH(T.col, '] ', ''))) ) sub) sWHERE val <> ''GROUP BY id, valHAVING n <> MAX(n)ORDER BY id,n;
Изход:
╔═════╦═════════════╦═══════╦═════════════╦═══════╦══════════╦════╗║ id ═╗║ id ══ ═══ ═ n ═════════╬════╣║ 1 ║ CE31285LV4 ║ 1 ║║ 1 ║ D32E ║ 3 ║║ 1 ║ GTX750 ║ 5 ║║ 1 ║ M256S ║ 7 ║║ 1 ║ H2X1T ║ 9 ║ ║ 1 ║ FMLANE4U4 ║ 11 ║╚═════╩═════════════╩═══╩═══╩══════
РЕДАКТИРАНЕ 3:
КРЪСТО ПРИСЪЕДИНЯВАНЕ
и цялата подзаявка е само таблица за изчисление. Това е всичко. Ако MySQL
има функция за генериране на числова последователност (като generate_series
или предварително попълнена таблица с числа няма нужда от CROSS JOIN
.
Таблица с числа е необходима за SUBSTRING_INDEX
: