10

以下查询:

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

产生预期的结果。但是,我想排除匹配某个值的(未嵌套的)行。向查询添加条件,例如:

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

显然行不通。这可能吗?如何?

4

2 回答 2

9

如果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'-'

然后您可以使用@>运算符检查是否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)

通过忘记存在隐式连接来帮自己一个忙,始终使用显式连接条件。

于 2012-06-26T20:40:47.557 回答
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,在示例中是相反的。如果您对所有清晰度感到困惑,请尝试在and子句中替换x-> 。yWHEREORDER BY

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

sqlfiddle 上的演示。

于 2012-06-26T21:29:17.700 回答