我在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/

10-15 22:46