我在posgresql数据库的表中有以下行:
INSERT INTO "public"."position" ("id",
"layout_id",
"dining_table_id",
"x_position",
"y_position",
"translate_x",
"translate_y",
"rotation",
"start_timestamps",
"end_timestamps")
VALUES (683, 32, 683, 1288, 0, E'{0,25}', E'{134,-98}', 0, E'{"2019-03-05 10:24:00","2019-04-05 10:24:00"}', E'{"2019-03-05 21:00:00","2019-04-05 21:00:00"}');
我想做一个查询,它返回我:
x U位置
你的位置
旋转
和
翻译
翻译
但在这些列中,只有满足以下条件:
如果给定的时间戳(它来自前端,应该是查询条件的一部分)大于或等于开始时间戳,并且小于结束时间戳数组元素,该数组元素在数组中的位置与translate和translate数组元素相同。
例如,如果给定的时间戳是:2019-03-05 12:00:00
translate_x列的数组元素,值为0(位置0),并且
应返回值为134(位置0)的translate_y列的数组元素,因为2019-03-05 12:00:00小于end_timestamps columns数组元素(位置0),并且大于或等于start_timestamps columns数组元素(位置0)。
我的问题是如何查询相应的表?(我希望我的桌子结构合理)
我的尝试:
const result = await this.db.query(`
SELECT
p.x_position,
p.y_position,
p.rotation,
FROM POSITION p
DECLARE
s int8 := 0;
x int;
BEGIN
FOR x IN s..p.start_timestamps.length LOOP IF p.start_timestamps[x] <= $1
AND p.end_timestamps[x] > $1 THEN RETURN p.translate_x[x], p.translate_y[x] END LOOP;`
[timestamp]);
最佳答案
如果我理解正确,你可以这样做:
select * from (
select i,id,layout_id,dining_table_id,x_position,y_position,translate_x[i],
translate_y[i],start_timestamps[i],end_timestamps[i] from (
select generate_subscripts(translate_x,1) i,* from position
) a
) b where start_timestamps<='2019-03-05 12:00:00'::timestamp
and end_timestamps>'2019-03-05 12:00:00'::timestamp
它应该可以工作,但是如果可以更改数据库的定义,则应该创建一个新表,例如:
position_periods : (id_position integer ,start_timestamp timestamp,end_timestamp timestamp,translate_x integer,translate_y integer)
关于arrays - 根据条件和数组元素位置循环遍历PostgreSQL表中的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56055884/