根据 bigint[] 数据类型的客户 ID 获取日期名称

Get day name based on custome ID of bigint[] datatype

我想在 table 中根据 bigint[] 中的 ID 显示日期名称,如下所示:

Table:

create table tbl_days
(
day_ids bigint[]
);

记录:

insert into tbl_days values('{1,2}');
insert into tbl_days values('{1,2,3}');
insert into tbl_days values('{1,4}');
insert into tbl_days values('{4,7}');
insert into tbl_days values('{1,2,3,4,5,6,7}');
insert into tbl_days values('{2,4,7}');

想要显示日期名称:

1 代表星期一 2 星期二 . .. 周日 7。

查询 1:使用 replace(),这需要 3 秒以上才能获得主要查询结果。

select replace(replace(replace(replace(replace(replace(replace(day_ids::varchar,'1','Monday'),'2','Tuesday'),'3','Wednesday'),'4','Thursday'),'5','Friday'),'6','Saturday'),'7','Sunday') 
from tbl_days;

查询 2:使用 string_agg(),这里是订单问题。

第 1 步:将天数添加到 temp table

create temp table temp_days
(
id int,
days varchar
);

insert into temp_days values(1,'Monday'),(2,'Tuesday'),(3,'Wednesday'),(4,'Thursday'),(5,'Friday'),(6,'Saturday'),(7,'Sunday');

第 2 步:加入主要 table

select d.day_ids,string_agg(distinct t.days,',') 
from tbl_days d 
inner join temp_days t on t.id = any(d.day_ids)
group by d.day_ids

step-by-step demo:db<>fiddle

SELECT
    id,
    string_agg(                                               -- 4
        CASE day                                              -- 3
            WHEN 1 THEN 'Monday'
            WHEN 2 THEN 'Tuesday'
            WHEN 3 THEN 'Wednesday'
            WHEN 4 THEN 'Thursday'
            WHEN 5 THEN 'Friday'
            WHEN 6 THEN 'Saturday'
            WHEN 7 THEN 'Sunday'
        END,
        ','
        ORDER BY index_in_array                               -- 4
    ) 
FROM (
    SELECT
        *,
        row_number() OVER () as id                            -- 1
    FROM tbl_days
) s,
unnest(day_ids) WITH ORDINALITY as t(day, index_in_array)     -- 2
GROUP BY id
  1. 对于我的方法,您需要一个 id 列。这创造了一个。如果你已经有了,可以忽略这一步
  2. unnest() 将数组扩展为每个元素一行。 WITH ORDINALITY 子句在记录中添加了一个 index 来保存元素在原始数组中的位置
  3. 使用 CASE 子句将数字替换为相关字符串
  4. 按原来的 id 重新汇总工作日。使用in(2)createdindex可以保证顺序,可以在aggregate
  5. ORDER BY子句中使用