sql substr переменная url процесс извлечения - PullRequest
0 голосов
/ 13 ноября 2018

Контекст:
до сих пор я использую регулярное выражение в SQL для извлечения переменных URL-адресов. Я нахожу это очень медленным и хочу оптимизировать его, используя команды substr и instr. Это важно для меня, потому что, поскольку я новичок в SQL, это помогает мне быть более знакомым с такими командами.

База данных: мой БД сделан постами, извлеченными из социальных платформ. текст называется "титр". Содержит переменные url в разных форматах: www, http, https. Я хочу создать таблицу или табличное представление (я не исправлена), содержащее эти URL и связанный с ним id_post.

Моя работа: Я заметил, что URL-адрес всегда заканчивается пробелом, например: «чтобы захотеть поделиться с вами этим www.example.com в своем посте» вот что я сделал до сих пор:

---longueur de la chaîne de caractère depuis https
select LENGTH(substr(titre, INSTR(titre,'https:'))) from post_categorised_pages where id_post = '280853248721200_697941320345722';
---longueur de la chaîne de caractère depuis le blanc
select LENGTH(substr(titre, INSTR(titre,' ', 171))) from post_categorised_pages where id_post = '280853248721200_697941320345722';
--- différence pour obtenir la longueur de chaîne de caractères de l'url
select LENGTH(substr(titre, INSTR(titre,'https:'))) - LENGTH(substr(titre, INSTR(titre,' ', 171))) as longueur_url from post_categorised_pages where id_post = '280853248721200_697941320345722';
---url
select substr(titre, 171, 54)from post_categorised_pages where id_post = '280853248721200_697941320345722';

Вопрос: Как я могу автомотизировать это по всей таблице "post_categorised_page"? Могу ли я представить случай, когда заявления принимать во внимание https или http of www. и как я могу это сделать?

Большое спасибо !!!!

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Хорошо, ребята, вот решение, которое я нашел (все еще одна ошибка, см. В конце поста).Я использую два представления, чтобы наконец извлечь мои строки.Первый вид - это создание по запросу:

--- create intermediate table view with targeted pattern position
create or replace view Start_Position_Index as
with "post" as
(select id, text from "your_table" where id= 'xyz')
select id, instr(text,'#', 1, level) as position, text
from post
connect by level <= regexp_count(titre, '#');

, затем

--- create working table view with full references and blank position for each pattern match and string_lenght for each one
create or replace view _#_index as
select id, position as hashtag_pos, INSTR(text,' ', position) as blank_position, INSTR(text,' ', position) - position as string_length, text
from Start_Position_Index;

В конце вы сможете получить хештеги (в этом случае), которые искали втвоя строкаИтак, ошибки: - если шаблон, который вы ищете, находится в конце вашей строки, он получит нулевое значение, потому что не будет пробела (как в конце строки).- это не очень хорошо оптимизировано, потому что здесь я работаю с представлениями, а не с таблицами.Я думаю, что использование таблиц будет быстрее.

Но я почти уверен, что есть много вещей, чтобы оптимизировать этот код ... любая идея?Задача состояла в том, чтобы рекурсивно извлечь конкретный шаблон из строк без использования дорогостоящего регулярного выражения и без использования pl / sql.Что вы думаете об этом?

0 голосов
/ 20 декабря 2018

Как насчет использования Oracle Full Text search?

Это будет индексировать все слова из столбца и предоставит хэштеги или веб-адреса, так как оба написаны одним словом, без пробела между ними.

0 голосов
/ 13 ноября 2018

Возможно, вместо строки «HTTP», HTTPS »или« WWW »вам понадобится имя столбца. В этом случае, вероятно, было бы полезно иметь таблицу определений, где можно определить все возможныеИсточники. Эта таблица должна иметь 2 столбца (ID и имя_источника).

Затем, в вашей таблице post_categorised_pages, также вставить источник сообщения (значение идентификатора). Затем в запрос, чтобыобъединить с этой таблицей определений по ID и вместо

select substr(titre, INSTR(titre,'https:'), (LENGTH(substr(titre, INSTR(titre,'https:'))) - LENGTH(substr(titre, INSTR(titre,' ', (INSTR(titre,'https:')))))))from post_categorised_pages where id_post = '280853248721200_697941320345722';

иметь

select substr(titre, INSTR(titre,"definition table".source_name), (LENGTH(substr(titre, INSTR(titre,"definition table".source_name))) - LENGTH(substr(titre, INSTR(titre,' ', (INSTR(titre,"definition table".source_name)))))))from post_categorised_pages where id_post = '280853248721200_697941320345722';
...