Postgresql 获取“,”逗号或特殊字符后的字符串

Postgresql 获取“,”逗号或特殊字符后的字符串,postgresql,split,Postgresql,Split,字段名为message,表名为log 数据示例: 消息的值: wsname、cmdcode、stacode、数据、订单id值hyd-l904149,2,1,1584425657892; wsname、cmdcode、stacode、data、order_id值hyd-l93mt54,2,1,1584427657892; 命令执行、命令id、工作站、cmdcode、stacode、应用程序到应用程序kill、应用程序参数值kill、1583124192811、hyd-psag314、10、2、ts

字段名为message,表名为log

数据示例:

消息的值:

wsname、cmdcode、stacode、数据、订单id值hyd-l904149,2,1,1584425657892; wsname、cmdcode、stacode、data、order_id值hyd-l93mt54,2,1,1584427657892; 命令执行、命令id、工作站、cmdcode、stacode、应用程序到应用程序kill、应用程序参数值kill、1583124192811、hyd-psag314、10、2、tsws.exe、-u生产; 在日志表中,我需要获得单独的列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 使用regexp_匹配项提取values子句的左侧和右侧部分,然后使用regexp_split_to_数组以逗号分割这些部分,然后使用=anyyour_数组构造筛选包含wsname的行,然后从数组中选择所需的列


或者-替代解决方案-将数据修复为insert语句的语法有效部分,创建辅助表,将数据插入其中,然后只需选择。

正如我在POSGRESQL中提到的关于内置函数的注释部分所述

拆分部分字符串、分隔符、字段号


由于受联合国支持的9.3版的json功能非常有限,因此我希望扩展,然后像这样做:

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_objecttext[],text[]传递由regexp_matches调用生成的两个数组。

与您的问题无关,但是:Postgres 9.3是您应该尽快计划升级。您在寻找select语句吗?消息列是否包含逗号分隔的值?如果是,那么您可以使用split_part来获取分离的值。使用键/值对更改写入日志表的代码以将该信息存储为JSONB值可能会容易得多。