powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / FAQ: обработка строк и парсинг текстов средствами MySQL
8 сообщений из 33, страница 2 из 2
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39229543
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эту конструкцию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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



можно заменить на
Код: sql
1.
2.
3.
4.
5.
SET @d = 0;
SELECT
  @d := @d+1 AS d
FROM любая_таблица
WHERE @d < 10
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39229645
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это хорошо, когда есть под рукой "любая таблица" с достаточным количеством записей... а то к INFORMATION_SCHEMA придётся обращаться - как бы некрасиво...
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39323166
Фотография paha4444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

100% жесть полная! Интересно, если БД огромная то сколько займут времени такие запросы....
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39604106
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paha4444,

Жесть конечно, но практика показывает что разбор текстов запросами выполняется примерно за то же самое время что и выборка из таблицы + запрос средствами клиента на ЯВУ а в ряде случаев и шустрее. Как ни странно. :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39650659
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла задача парсинга данных в MySQL.
Нашел проблему в использовании алгоритма стартового поста.

Пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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 по ; и записать данные в другую таблицу, сгруппировав по тексту.

Т.е. я должен получить такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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


Но для начала хотя бы такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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'




Делаю запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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` <> ''



Он возвращает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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) получаются типа равнозначными по кол-ву записей...

У кого-то есть подходящий вариант решения или задачу надо передавать на клиентский уровень? :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39650661
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла задача парсинга данных в MySQL.
Нашел проблему в использовании алгоритма стартового поста.

Пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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 по ; и записать данные в другую таблицу, сгруппировав по тексту.

Т.е. я должен получить такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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


Но для начала хотя бы такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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'




Делаю запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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` <> ''



Он возвращает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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) получаются типа равнозначными по кол-ву записей...

У кого-то есть подходящий вариант решения или задачу надо передавать на клиентский уровень? :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39930770
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то обратил внимание, что на дворе давно восьмая версия, а никто не шевелится. А она принесла много нового, в том числе и новые подходы к парсингу CSV-полей.

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 |
+---------------+



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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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     |
+---------------+-------+



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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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   |
+-------+



Если кому не нравится, что визуальные числа сортируются как строки - ноль прибавляйте сами.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FAQ: обработка строк и парсинг текстов средствами MySQL
    #40077331
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

CAST в ORDER BY исправит сортировку?
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / FAQ: обработка строк и парсинг текстов средствами MySQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]