@David138

Как в поле выделить ссылку на postgresql?

в колонке data есть большое поле:
100.101.198.210			20140107230416	http://news.rambler.ru/6389411	798	503	Safari/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112)n

Как тут в отдельные поля выделить поле браузера - Safari/5.0 и поле ссылки -http://news.rambler.ru/6389411

Я пытаюсь сделать так:

substring(
		dl.data, 
		strpos(dl.data, 'http'),
		strpos(dl.data, '	')
	) as LINK

Но ответ выводит такой:
http://news.ramb

Как решить эти проблемы?
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
erge
@erge
Примус починяю
На лицо просматривается CSV структура с разделителями - табами ( chr(9) ), соответственно проще просто разбить структуру в массив функцией string_to_array() по символу табуляции chr(9) и потом просто взять из массива требуемые элементы.
Через LATERAL JOIN присоединяем результат функции к основной таблице , получаем

SELECT arr[5] AS url, arr[8] AS user_agent
  FROM some_table AS st
  CROSS JOIN LATERAL STRING_TO_ARRAY(st.data, chr(9)) AS arr

см. UNDERSTANDING LATERAL JOINS IN POSTGRESQL , Пример использования LATERAL JOIN в PostgreSQL и т.п.

Или "аналогичный" вариант с разбиением строки на подстроки по разделителю - split_part()
SELECT
    split_part(data, chr(9), 5),
    split_part(data, chr(9), 8)
  FROM some_table


Либо же через извлечение подстроки по шаблону регулярного выражения
см. Extracting substring matching POSIX regular expression
SELECT substring(data,'http[^\t]+') AS url, substring(data,'[^\t]+$') AS user_agent FROM some_table


см. пример на dbfiddle
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@nApoBo3
Учить синтаксис substring, https://www.postgresql.org/docs/9.1/functions-stri...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы