以下查询:
select unnest(Table2.L) as X, unnest(Table1.O)
from Table1, Table2
where Table1.code = Table2.code
order by X ;
产生所需的结果。但是,我想排除(未使用的)与某些值匹配的行。向查询添加条件,例如:
and unnest(Table2.L) != '-'
显然不起作用。这可能吗?怎么样?
答案 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
。
请注意,我解开了table1
和table2
,这在示例中是相反的。如果您对所有清晰度感到困惑,请尝试替换x
- &gt; y
和WHERE
条款中的ORDER BY
。
如果您确实想要消除双方-
的出现次数,请添加AND y <> '-'
到WHERE子句 - 使其对称(不可能使用cuonfusion)
如果不能保证x是唯一的,我也会ORDER BY x, y
使排序顺序稳定。