查询数组元素的值(PostgreSQL)

时间:2012-06-26 20:04:57

标签: arrays postgresql postgresql-8.4

以下查询:

select unnest(Table2.L) as X, unnest(Table1.O) 
from Table1, Table2 
where Table1.code = Table2.code 
order by X ;

产生所需的结果。但是,我想排除(未使用的)与某些值匹配的行。向查询添加条件,例如:

and unnest(Table2.L) != '-'

显然不起作用。这可能吗?怎么样?

2 个答案:

答案 0 :(得分:8)

如果你的意思是unnest(Table2.L) != '-'

  

抛弃所有'-'

的无效元素

然后使用派生表并过滤掉您不想要的未使用的值:

select *
from (
    select unnest(Table2.L) as X, unnest(Table1.O) 
    from Table1 join Table2 on Table1.code = Table2.code
) dt
where X != '-'
order by X ;

如果你的意思是

  

忽略Table2 L包含'-'

的所有行

然后您可以使用@> operator检查L是否包含某个元素:

select unnest(Table2.L) as X, unnest(Table1.O)
from Table1 join Table2 on Table1.code = Table2.code
where not Table1.L @> ARRAY['-']

或者您可以使用ANY

select unnest(Table2.L) as X, unnest(Table1.O)
from Table1 join Table2 on Table1.code = Table2.code
where not '-' = any(Table1.L)

通过忘记存在隐式连接来帮助自己,总是使用显式连接条件。

答案 1 :(得分:3)

另一种方法:

SELECT x, y
FROM  (SELECT code, unnest(l) AS x FROM table1) t1
JOIN  (SELECT code, unnest(o) AS y FROM table2) t2 USING (code)
WHERE  x <> '-'
ORDER  BY x;

可能不会更快。取决于WHERE子句的选择性。快速运行EXPLAIN ANYLYZE

请注意,我解开了table1table2,这在示例中是相反的。如果您对所有清晰度感到困惑,请尝试替换x - &gt; yWHERE条款中的ORDER BY

如果您确实想要消除双方-的出现次数,请添加AND y <> '-' 到WHERE子句 - 使其对称(不可能使用cuonfusion) 如果不能保证x是唯一的,我也会ORDER BY x, y使排序顺序稳定。

Demo on sqlfiddle.