我有一张类似的表:
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的帮助下,我能够找到分数中的特定匹配,但我找不到使用变量并将其与值进行比较的方法。
提前致谢!
答案 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)