我有一系列记录。记录类似于(id, text_value)
我想在WHERE
条款中进行搜索。我想在记录数组中包含具有特定值的行。但是,函数ANY
似乎将等式视为单个值。例如:
WHERE 'one' = ANY('{one,two}'::text[])
然而,我的条款是ANY(array_of_records)
。因此,左侧需要访问记录中的列。
这是否可以在WHERE子句中使用,还是应该使用plpgsql循环遍历行?
我也很高兴使用json
或jsonb
来搜索任何记录数组,如果有帮助的话。
答案 0 :(得分:2)
只需要删除数组并将其加入到您的表中即可。我将对您的架构做一些假设......这是您所指的记录,您可以从中创建一个数组r[]
:
CREATE TYPE r AS (
id INT,
text_value TEXT
);
这是包含您要在记录数组中搜索的值的表:
CREATE TABLE t(v) AS
VALUES ('a'), ('b'), ('c'), ('d');
现在,只需加入两个:
SELECT *
FROM t
JOIN unnest(array[row(1, 'a')::r, row(2, 'b')::r]) u
ON t.v = u.text_value
这将产生
v id text_value
-----------------
a 1 a
b 2 b
答案 1 :(得分:1)
我认为最简单的方法是在查询之前创建一些过滤器。
$ tmp = array();
for(i = 0; i< array.length; i ++){ 如果(条件) $ tmp [] = array [i]; }
$ query =“SELECT * FROM示例WHERE id IN(”。implode(',',$ tmp)。“)”;