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

juud5qan  于 2023-02-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(101)

我有这样的字符串:

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 days::interval),如果我只得到一个数字列表,我就可以做到,但是我还需要将结果绑定到每个字符串,所以目标是这样的输出:

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

其中eventdate是计划开始日期+事件发生在计划的哪一天。我不知道如何获取我创建的解压缩字符串并使用它来执行日期计算,以及将它与字符串绑定。
我考虑过只做一次unnest,所以它是11=TTR和14=DNV,但是我也不确定如何得到我想要的结果,有没有一种方法可以读取一个字符串,直到你到达一个特定的字符,然后在计算中使用它,然后读取字符串中超过特定字符的每个字符到一个新的列中?
我知道完全重写如何处理这将是理想的,但我没有最初写它,我没有时间或手段来重写这是使用的~20个位置。

9njqaruj

9njqaruj1#

下面是您的表(我添加了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

相关问题