Получить строку после запятой, запятой или специальных символов - PullRequest
0 голосов
/ 15 апреля 2020

Имя поля message, имя таблицы log.

Примеры данных:

Значения для сообщения:

"(wsname,cmdcode,stacode,data,order_id) values (hyd-l904149,2,1,,1584425657892);"
"(wsname,cmdcode,stacode,data,order_id) values (hyd-l93mt54,2,1,,1584427657892);"
(command_execute,order_id,workstation,cmdcode,stacode,application_to_kill,application_parameters) values  (kill, 1583124192811, hyd-psag314, 10, 2, tsws.exe,  -u production ); "

и в таблице журнала мне нужно получить отдельный столбец wsname со значениями как hyd-l904149 и hyd-l93mt54 и hyd-psag314, столбец cmdcode со значениями как 2,2 и 10 и столбец stacode со значениями как 1,1 и 2, например:

wsname        cmdcode   stacode
hyd-l904149   2         1
hyd-l93mt54   2         1
hyd-psag314   10        2

Ответы [ 3 ]

0 голосов
/ 15 апреля 2020

Как и в разделе комментариев, я упоминал о встроенной функции в posgres sql

split_part (string, delimiter, field_number)

http://www.sqlfiddle.com/#! 15 / eb1df / 1

0 голосов
/ 15 апреля 2020

Поскольку возможности json неподдерживаемой версии 9.3 очень ограничены, я бы установил расширение hstore , а затем сделал бы это так:

select coalesce(vals -> 'wsname', vals -> 'workstation') as wsname, 
       vals -> 'cmdcode' as cmdcode,
       vals -> 'stacode' as stacode
from (
  select hstore(regexp_split_to_array(e[1], '\s*,\s*'), regexp_split_to_array(e[2], '\s*,\s*')) as vals
  from log l, 
    regexp_matches(l.message, '\(([^\)]+)\)\s+values\s+\(([^\)]+)\)') as x(e)
) t  

regexp_matches() разбивает сообщение на два массива: один для списка имен столбцов и один для соответствующих значений. Эти массивы используются для создания пары ключ / значение, чтобы я мог получить доступ к значению каждого столбца по имени столбца.

Если вы знаете, что позиции столбцов всегда одинаковы, вы можете удалить использование типа hstore. Но для этого потребовалось бы довольно большое выражение CASE, чтобы проверить, где появляются настоящие столбцы.

Онлайн пример

В современной поддерживаемой версии Postgres я бы использовал jsonb_object(text[], text[]), передавая два массива, полученных в результате вызова regexp_matches().

0 голосов
/ 15 апреля 2020

Используйте regexp_matches для извлечения левой и правой части предложения values, затем regexp_split_to_array, чтобы разделить эти части запятыми, затем отфильтруйте строки, содержащие wsname, с использованием конструкции = any(your_array), затем select необходимые столбцы из массив.

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

...