pl / postgres过滤多维数组

时间:2018-03-14 14:29:08

标签: sql postgresql multidimensional-array

我有一张类似的表:

id | name | scores
---|------|-------
1  | dit  | {{3,145},{7,888},{6,13}}
2  | dat  | {{7,6}}
3  | dut  | {{2,3},{8,1}}
4  | dot  | {{7,2},{8,9}}

我希望得分存在的每一行都有一个7为第一个整数的元素,一个大于4的整数作为第二个值。

SELECT id FROM table WHERE scores @> '{7,x}' AND x > 4

所以输出结果为:

id
--
1
2

在jsonb的帮助下,我能够找到分数中的特定匹配,但我找不到使用变量并将其与值进行比较的方法。

提前致谢!

1 个答案:

答案 0 :(得分:0)

基于以下表格结构...

CREATE TEMPORARY TABLE t (id INT, scores NUMERIC[][]);

...包含以下记录......

INSERT INTO t VALUES (1,'{{3,145},{7,888},{6,13}}');
INSERT INTO t VALUES (2,'{{7,6}}');
INSERT INTO t VALUES (3,'{{2,3},{8,1}}');
INSERT INTO t VALUES (4,'{{7,2},{8,9}}');
INSERT INTO t VALUES (5,'{{7,5},{8,1}}');
INSERT INTO t VALUES (6,'{{2,1},{7,1}}');
INSERT INTO t VALUES (7,'{{7,3},{7,500}}');
INSERT INTO t VALUES (8,'{{7,1},{7,2}}');

...执行此功能...

CREATE OR REPLACE FUNCTION tom_function() RETURNS INT[] AS $$
DECLARE
 i RECORD;
 j INT;
 res INT[];
BEGIN
  FOR i IN SELECT * FROM t LOOP
    FOR j IN 1 .. ARRAY_LENGTH(i.scores, 1) LOOP
      IF i.scores[j][1]::INT = 7 AND i.scores[j][2]::INT > 4 THEN
         res := res || i.id;
      END IF;
    END LOOP;
  END LOOP;
 RETURN res;
END $$ language plpgsql;

...应该给你这个结果集:

SELECT tom_function();


 tom_function 
--------------
 {1,2,5,7}

或.. ..

SELECT UNNEST(tom_function());


 unnest 
--------
      1
      2
      5
      7
(4 rows)