Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: FAQ: обработка строк и парсинг текстов средствами MySQL  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18766
эту конструкцию
SELECT 1 AS num 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 UNION ALL
    SELECT 10 UNION ALL


можно заменить на
SET @d = 0;
SELECT
  @d := @d+1 AS d
FROM любая_таблица
WHERE @d < 10
5 май 16, 05:22    [19136394]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: обработка строк и парсинг текстов средствами MySQL  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20960
Это хорошо, когда есть под рукой "любая таблица" с достаточным количеством записей... а то к INFORMATION_SCHEMA придётся обращаться - как бы некрасиво...
5 май 16, 10:29    [19137011]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: обработка строк и парсинг текстов средствами MySQL  [new]
paha4444
Member

Откуда: Украина Одесская обл., Рени
Сообщений: 69
MasterZiv,

100% жесть полная! Интересно, если БД огромная то сколько займут времени такие запросы....
8 окт 16, 08:58    [19758447]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: FAQ: обработка строк и парсинг текстов средствами MySQL  [new]
Arhat109
Member

Откуда: из СССР
Сообщений: 3428
paha4444,

Жесть конечно, но практика показывает что разбор текстов запросами выполняется примерно за то же самое время что и выборка из таблицы + запрос средствами клиента на ЯВУ а в ряде случаев и шустрее. Как ни странно. :)
19 фев 18, 12:53    [21201562]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: обработка строк и парсинг текстов средствами MySQL  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
Возникла задача парсинга данных в MySQL.
Нашел проблему в использовании алгоритма стартового поста.

Пример:
create table tbl(
id int, 
data varchar(100) 
);

insert into tbl
values(1, 'vasya pupkin;vasya pupkin;vasya pupkin');

insert into tbl
values(2, 'vasya pupkin');

insert into tbl
values(3, 'vasya pupkin;petya petrov');


Надо разбить поле data по ; и записать данные в другую таблицу, сгруппировав по тексту.

Т.е. я должен получить такое:
SELECT 1, 'vasya pupkin', 3
UNION ALL
SELECT 2, 'vasya pupkin', 1
UNION ALL
SELECT 3, 'vasya pupkin', 1
UNION ALL
SELECT 3, 'petya petrov', 1

Но для начала хотя бы такое:
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 2, 'vasya pupkin'
UNION ALL
SELECT 3, 'vasya pupkin'
UNION ALL
SELECT 3, 'petya petrov'



Делаю запрос:
SELECT
    tmp.`num` AS `num`
    ,`id`
    , SUBSTRING_INDEX(SUBSTRING_INDEX(src.`data`, ';', tmp.`num`), ';', -1) AS `word`
  FROM (
    SELECT 1 AS num UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 
  ) AS tmp
  JOIN `tbl` AS src
  HAVING `word` <> ''


Он возвращает:
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 2, 'vasya pupkin'
UNION ALL
SELECT 2, 'vasya pupkin'
UNION ALL
SELECT 2, 'vasya pupkin'
UNION ALL
SELECT 3, 'vasya pupkin'
UNION ALL
SELECT 3, 'petya petrov'
UNION ALL
SELECT 3, 'petya petrov'

Т.е. всегда 3 записи, независимо от реального кол-ва разбиений.
В итоге у меня записи с ID IN (1, 2) получаются типа равнозначными по кол-ву записей...

У кого-то есть подходящий вариант решения или задачу надо передавать на клиентский уровень? :)
27 май 18, 15:41    [21444104]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: обработка строк и парсинг текстов средствами MySQL  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
Возникла задача парсинга данных в MySQL.
Нашел проблему в использовании алгоритма стартового поста.

Пример:
create table tbl(
id int, 
data varchar(100) 
);

insert into tbl
values(1, 'vasya pupkin;vasya pupkin;vasya pupkin');

insert into tbl
values(2, 'vasya pupkin');

insert into tbl
values(3, 'vasya pupkin;petya petrov');


Надо разбить поле data по ; и записать данные в другую таблицу, сгруппировав по тексту.

Т.е. я должен получить такое:
SELECT 1, 'vasya pupkin', 3
UNION ALL
SELECT 2, 'vasya pupkin', 1
UNION ALL
SELECT 3, 'vasya pupkin', 1
UNION ALL
SELECT 3, 'petya petrov', 1

Но для начала хотя бы такое:
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 2, 'vasya pupkin'
UNION ALL
SELECT 3, 'vasya pupkin'
UNION ALL
SELECT 3, 'petya petrov'



Делаю запрос:
SELECT
    tmp.`num` AS `num`
    ,`id`
    , SUBSTRING_INDEX(SUBSTRING_INDEX(src.`data`, ';', tmp.`num`), ';', -1) AS `word`
  FROM (
    SELECT 1 AS num UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 
  ) AS tmp
  JOIN `tbl` AS src
  HAVING `word` <> ''


Он возвращает:
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 1, 'vasya pupkin'
UNION ALL
SELECT 2, 'vasya pupkin'
UNION ALL
SELECT 2, 'vasya pupkin'
UNION ALL
SELECT 2, 'vasya pupkin'
UNION ALL
SELECT 3, 'vasya pupkin'
UNION ALL
SELECT 3, 'petya petrov'
UNION ALL
SELECT 3, 'petya petrov'

Т.е. всегда 3 записи, независимо от реального кол-ва разбиений.
В итоге у меня записи с ID IN (1, 2) получаются типа равнозначными по кол-ву записей...

У кого-то есть подходящий вариант решения или задачу надо передавать на клиентский уровень? :)
27 май 18, 15:45    [21444107]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: FAQ: обработка строк и парсинг текстов средствами MySQL  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20960
Что-то обратил внимание, что на дворе давно восьмая версия, а никто не шевелится. А она принесла много нового, в том числе и новые подходы к парсингу CSV-полей.

Ну собственно не буду много говорить, думаю, примеров более чем достаточно.

Исходные данные:

CREATE TABLE test (csv TEXT);
INSERT INTO test VALUES ('1,22,333'),('4,55,666,55,4');
SELECT * FROM test;

+---------------+
| csv           |
+---------------+
| 1,22,333      |
+---------------+
| 4,55,666,55,4 |
+---------------+


Ну, понеслася...

Парсинг с сохранением исходных:

SELECT *
FROM test
CROSS JOIN JSON_TABLE( CONCAT('[', test.csv, ']'),
                       "$[*]" COLUMNS( value VARCHAR(254) PATH "$" )
                     ) AS jsontable;

+---------------+-------+
| csv           | value |
+---------------+-------+
| 1,22,333      | 1     |
+---------------+-------+
| 1,22,333      | 22    |
+---------------+-------+
| 1,22,333      | 333   |
+---------------+-------+
| 4,55,666,55,4 | 4     |
+---------------+-------+
| 4,55,666,55,4 | 55    |
+---------------+-------+
| 4,55,666,55,4 | 666   |
+---------------+-------+
| 4,55,666,55,4 | 55    |
+---------------+-------+
| 4,55,666,55,4 | 4     |
+---------------+-------+


Только распарсенные данные:

SELECT jsontable.value
FROM test
CROSS JOIN JSON_TABLE( CONCAT('[', test.csv, ']'),
                       "$[*]" COLUMNS( value VARCHAR(254) PATH "$" )
                     ) AS jsontable;

+-------+
| value |
+-------+
| 1     |
+-------+
| 22    |
+-------+
| 333   |
+-------+
| 4     |
+-------+
| 55    |
+-------+
| 666   |
+-------+
| 55    |
+-------+
| 4     |
+-------+


Ну и вишенка на торте - DISTINCT и ORDER BY:

SELECT DISTINCT jsontable.value
FROM test
CROSS JOIN JSON_TABLE( CONCAT('[', test.csv, ']'),
                       "$[*]" COLUMNS( value VARCHAR(254) PATH "$" )
                     ) AS jsontable
ORDER BY jsontable.value;

+-------+
| value |
+-------+
| 1     |
+-------+
| 22    |
+-------+
| 333   |
+-------+
| 4     |
+-------+
| 55    |
+-------+
| 666   |
+-------+


Если кому не нравится, что визуальные числа сортируются как строки - ноль прибавляйте сами.
25 фев 20, 20:59    [22086822]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / MySQL Ответить