数组元素的值查询(PostgreSQL)

11
以下查询:
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个回答

11
如果您的意思是通过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 ;

如果您的意思是忽略Table2L包含'-'的所有行,则可以使用@>运算符来检查L是否包含特定元素:
select unnest(Table2.L) as X, unnest(Table1.O)
from Table1 join Table2 on Table1.code = Table2.code
where not Table1.L @> ARRAY['-']

或者你可以使用任意:

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

请忘记隐式连接的存在,始终使用显式连接条件。


我是指你回答中的第一个场景,但也感谢提供额外信息。 - SabreWolfy

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 ANALYZE。请注意,我解开了示例中颠倒的table1table2。如果您对所有清晰度感到困惑,请尝试在WHEREORDER BY子句中将x 替换为y。如果您实际上想要消除两侧的-出现,请添加AND y <> '-' 到WHERE子句中-使其对称(没有混淆)。如果x不保证唯一,请同时ORDER BY x, y以使排序顺序稳定。 sqlfiddle上的演示。

排除 '-' 行后,有大约 350 行匹配。你的答案给出了大约 34000,所以某些地方出错了 :) 我正在检查。此外,我能够在 "mu is too short" 提供的查询中包含来自 Table2 的其他列,但是在你的答案中无法这样做。 - SabreWolfy
可能有一些误解。我在我的回答中添加了一点内容以澄清。 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接