如何在 Postgres 列中查找以 INPUT 开头并包含 X 个字符实例的值?

问题描述 投票:0回答:1

我在 Postgres 表中有一个列,其值具有以下模式。

INPUT-X

INPUT-X-Y

INPUT-X-Y-Z

INPUT-X-Y-Z-A-...

我正在尝试计算 COLUMN 中的条目数,其中值以

INPUT
开头,并包含给定数量的
hyphens
。因此,如果输入值为
2023-08-04T09:00:32.822+00:00
,我想计算 COLUMN 中以
2023-08-04T09:00:32.822+00:00
开头并包含
3
连字符的所有条目。如果 COLUMN 中的值包括:

2023-08-04T09:00:32.822+00:00-1 
2023-08-04T09:00:32.822+00:00-1-1 
2023-08-04T09:00:32.822+00:00-2 
2023-08-04T09:00:32.822+00:00-2-1 
2023-08-04T09:00:32.822+00:00-3
2023-08-04T09:00:32.822+00:00-4

此操作的计数应等于

4
。 (这样做的目的是计算该系列的下一个值的索引,在本例中为
2023-08-04T09:00:32.822+00:00-5
。每个值都是对父条目的引用,例如
2023-08-04T09:00:32.822+00:00-5
表示对条目
 的第 5 个回复) 2023-08-04T09:00:32.822+00:00
。同样,
2023-08-04T09:00:32.822+00:00-2-3
表示对条目的第三次回复
2023-08-04T09:00:32.822+00:00-2
。)

我当前使用的代码是:

select count(*) from messages_dev where ref like input || '%-' || repeat('-', hyphens) || '%' into result;

但是返回 0,因为计数应该有更高的数字。

有人可以推荐一种在 Postgres 中获取此计数的方法吗?

sql postgresql function count supabase
1个回答
0
投票

当你有一个字符串时,你可以使用字符串函数来获取下一个数字。

但最好不要以这种方式存储它,因为字符串函数通常非常慢,并且规范化的表结构更适合关系数据库

此查询将找到所有序列并获得最大的数字,如果您只想要特定的序列,则需要添加您想要的日期。

当你想在并行系统中使用它时,你应该阅读有关一致性的内容。

CREATE TABLE mytable
    ("mycolumn" varchar(33))
;
    
INSERT INTO mytable
    ("mycolumn")
VALUES
    ('2023-08-04T09:00:32.822+00:00-1'),
    ('2023-08-04T09:00:32.822+00:00-1-1'),
    ('2023-08-04T09:00:32.822+00:00-2'),
    ('2023-08-04T09:00:32.822+00:00-2-1'),
    ('2023-08-04T09:00:32.822+00:00-3'),
    ('2023-08-04T09:00:32.822+00:00-4')
;

WITH CTE AS (select Substring(mycolumn,0,30) datetxt,MAX(split_part(mycolumn, '-', 4))::int +  1 newnum
FROM mytable
GROUP BY 1)
SELECT CONCAT(datetxt,'-', newnum::text)
  FROM CTE
连接
2023-08-04T09:00:32.822+00:00-5

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.