Mysql
 sql >> база данни >  >> RDS >> Mysql

Извличане на подниз със специфичен модел в MySql

Това не е работа за 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 <> ''ПОРЪЧАЙ ПО ИД; 

SqlFiddleDemo

Забележка:

В зависимост от col максимална дължина, от която може да се нуждаете, за да генерирате повече числа в CROSS JOIN раздел. Засега е до 100.

Изход:

Как работи:

  1. Генерирайте таблица с числа с CROSS JOIN
  2. Разделяне на низ въз основа на ] като разделител
  3. RIGHT(val, LENGTH(val) - LOCATE('[', val)) премахнете частта до [
  4. филтрирайте празните записи
  5. Вземете само 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; 

SqlFiddleDemo

Изход:

╔═════╦═════════════╦═══════╦═════════════╦═══════╦══════════╦════╗║ 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 :




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. rails + MySQL на OSX:Библиотеката не е заредена:libmysqlclient.18.dylib

  2. как да запазя enum стойност в DB с Hibernate?

  3. mysql Изберете от Избор

  4. Предупреждение:mysql_error():предоставеният аргумент не е валиден ресурс на MySQL-Link

  5. връзка към база данни между два mysql сървъра, работещи на две различни места