以下查询:
select unnest(Table2.L) as X, unnest(Table1.O)
from Table1, Table2
where Table1.code = Table2.code
order by X ;
产生预期的结果。但是,我想排除匹配某个值的(未嵌套的)行。向查询添加条件,例如:
and unnest(Table2.L) != '-'
显然行不通。这可能吗?如何?
以下查询:
select unnest(Table2.L) as X, unnest(Table1.O)
from Table1, Table2
where Table1.code = Table2.code
order by X ;
产生预期的结果。但是,我想排除匹配某个值的(未嵌套的)行。向查询添加条件,例如:
and unnest(Table2.L) != '-'
显然行不通。这可能吗?如何?
如果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)
通过忘记存在隐式连接来帮自己一个忙,始终使用显式连接条件。
另一种方法:
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
,在示例中是相反的。如果您对所有清晰度感到困惑,请尝试在and子句中替换x
-> 。y
WHERE
ORDER BY
如果您确实想消除-
两边的出现,请添加AND y <> '-'
到 WHERE 子句 - 使其对称(不可能出现混淆)。如果不能保证 x 是唯一的,
我也会使排序顺序稳定。ORDER BY x, y