字符串拆分和仅对某些结果进行操作

时间:2018-04-12 19:48:13

标签: postgresql

我的字符串看起来像这样:

schedulestart |             event_labels

2018-04-04    |   9=TTR&11=DNV&14=SWW&26=DNV&2=QQQ&43=FTW

当我在数据库中查看它时。我的代码以这种格式依赖于此字符串,以显示包含那些日期带有这些标签的事件的计划。

现在我发现自己需要在postgres中分解字符串以进行报告/分析,我不能真正拿出字符串并用另一种语言解析它,所以我必须坚持使用postgres。

我找到了解压缩字符串的方法,所以我的结果如下:

User  ID | Schedule Start | Unpacked String
 2       | 2018-04-04     | TTR
 2       | 2018-04-04     | 9
 2       | 2018-04-04     | DNV
 2       | 2018-04-04     | 11
 2       | 2018-04-04     | SWW
 2       | 2018-04-04     | 14
 2       | 2018-04-04     | DNV
 2       | 2018-04-04     | 26

select schedulestart, unnest(string_to_array(unnest(string_to_array(event_labels, '&')), '=')) from table;

现在我需要的是一种实际执行间隔计算的方法(所以2018-04-04 + 11天::间隔),如果我只得到一个数字列表,我可以,但我还需要绑定该结果到每个字符串。所以目标是这样的输出:

eventdate   |   event_label
2018-04-12  |   TTR
2018-04-20  |   DNV

其中eventdate是计划开始时间+事件所在计划的哪一天。我不确定如何获取我创建的解压缩字符串并使用它来执行日期计算,并将其绑定到字符串。

我考虑过只做一个,因此它是11 = TTR和14 = DNV,但我不知道如何将其带到我想要的结果。有没有办法在到达某个字符之前读取字符串,然后在计算中使用它,然后将字符串中某个字符的每个字符读取到一个新列中?

我知道完全重写如何处理这将是理想的,但我最初并没有写它,我没有时间或方法重写这个使用的~20个位置。

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:1)

这是您的表格(我添加了userid列):

CREATE TABLE test(userid INTEGER, schedulestart DATE, event_labels VARCHAR);

输入数据:

INSERT INTO test(userid,schedulestart , event_labels) VALUES 
(2,DATE '2018-04-04', '9=TTR&11=DNV&14=SWW&26=DNV&2=QQQ&43=FTW');

最后解决方案:

SELECT  
    userid,
    (schedulestart + (SPLIT_PART(kv,'=',1)||' days')::INTERVAL)::DATE AS eventdate,
    SPLIT_PART(kv,'=',2) AS event_label
FROM (
      SELECT 
         userid,schedulestart,
         REGEXP_SPLIT_TO_TABLE(event_labels, '&') AS kv
      FROM test
      WHERE userid = 2
) a