根据 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
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
- 对于我的方法,您需要一个
id
列。这创造了一个。如果你已经有了,可以忽略这一步
unnest()
将数组扩展为每个元素一行。 WITH ORDINALITY
子句在记录中添加了一个 index
来保存元素在原始数组中的位置
- 使用
CASE
子句将数字替换为相关字符串
- 按原来的
id
重新汇总工作日。使用in(2)createdindex
可以保证顺序,可以在aggregate 的ORDER BY
子句中使用
我想在 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
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
- 对于我的方法,您需要一个
id
列。这创造了一个。如果你已经有了,可以忽略这一步 unnest()
将数组扩展为每个元素一行。WITH ORDINALITY
子句在记录中添加了一个index
来保存元素在原始数组中的位置- 使用
CASE
子句将数字替换为相关字符串 - 按原来的
id
重新汇总工作日。使用in(2)createdindex
可以保证顺序,可以在aggregate 的
ORDER BY
子句中使用