Преобразование нескольких значений из столбца в строки с помощью Regex - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в мире Regex и пытаюсь извлечь шаблон из текстового столбца произвольной формы в таблице.

Есть две вещи, которых я пытаюсь достичь 1. Извлечь несколько вхождений шаблон. Шаблон, который я пытаюсь извлечь, представляет собой URL-адрес, который начинается с http или https. 2. После нахождения нескольких вхождений URL-адреса мне пришлось бы разбить их на несколько строк.

Таблица ввода

ip_table (user_id, notes)

(123, 'Here are notes - he owns url https://123.com/asda/32/1221 and http://www.facebook.com/page1 so on')
(234, 'this one has http://www.instagram.com/page3/12321213 (https://example.com/1233/qwerty)

Таблица вывода

op_table (user_id, urls)

(123, 'https://123.com/asda/32/1221')
(123, 'http://www.facebook.com/page1')
(234, 'http://www.instagram.com/page3/12321213')
(234, 'https://example.com/1233/qwerty')

Вот что у меня есть для регулярного выражения, но безуспешно.

select user_id, regexp_substr(notes, '(https?)://.*[\s]')

Не могли бы вы дать мне какое-нибудь направление, как мне найти повторяющиеся шаблоны шаблонов URL? Единственное, что мне нужно будет проверить, - это что-то, что начинается с http | https, захватить этот шаблон (ы) и повторить его несколько раз в столбце примечаний. Как только я найду эту строку, мне придется разбить ее на несколько строк с соответствующими идентификаторами пользователей.

1 Ответ

0 голосов
/ 06 мая 2020

Попробуйте следующее:

WITH
input(id,str) AS (
          SELECT 123, 'Here are notes - he owns url https://123.com/asda/32/1221 and http://www.facebook.com/page1 so on'
UNION ALL SELECT 234, 'this one has http://www.instagram.com/page3/12321213 (https://example.com/1233/qwerty)'
)

-- create a series of 4 integers in Vertica 
-- keep this code-snippet as you'll need it often
-- without Vertica, UNION SELECT 1, 2, 3 and 4
,l(l) AS (
          SELECT TIMESTAMPADD(us,  1  , DATE '2000-01-01' )
UNION ALL SELECT TIMESTAMPADD(us,  4  , DATE '2000-01-01' )
)
,i(i) AS (
  SELECT
    MICROSECOND(ts)
  FROM l
  TIMESERIES ts AS '1 us' OVER(ORDER BY l)
)
-- end create series of 4 integers: CTE i, column i.

-- verticalise the series of tokens found - one row per URL
-- CROSS JOIN input with series of integers to extract the i-th occurrence
SELECT
  id
, i
, regexp_substr(str,'https?://[^\s):"'']+',1, i ) AS url_found
FROM input CROSS JOIN i
WHERE regexp_substr(str,'https?://[^\s):"'']+',1, i ) IS NOT NULL
ORDER BY 1,2;
-- out  id  | i |                url_found                
-- out -----+---+-----------------------------------------
-- out  123 | 1 | https://123.com/asda/32/1221
-- out  123 | 2 | http://www.facebook.com/page1
-- out  234 | 1 | http://www.instagram.com/page3/12321213
-- out  234 | 2 | https://example.com/1233/qwerty
-- out (4 rows)
-- out 
-- out Time: First fetch (4 rows): 12.555 ms. All rows formatted: 12.599 ms

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...