我的字符串看起来像这样:
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个位置。
感谢您提供任何帮助!
答案 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