SQL加入运营商IN
问题描述:
我在使用IN
加入两个表时遇到问题。 例子:SQL加入运营商IN
with nodes(node_id, mpath) as (
SELECT node_id, drugs_cls_node_view.mpath
FROM drugs_cls_entries_view
inner join drugs_cls_node_view on drugs_cls_node_view.id = node_id
WHERE mnn_id in (13575)
)
select DISTINCT n.node_id, drugs_cls_node_view.*
from nodes n
inner join drugs_cls_node_view
on drugs_cls_node_view.id in (array_replace(string_to_array(n.mpath, '/'), '', '0')::bigint[])
我得到异常:
ERROR: operator does not exist: bigint = bigint[]
答
随着
on drugs_cls_node_view.id in
(array_replace(string_to_array(n.mpath, '/'), '', '0')::bigint[])
您要查找的ID在只包含一个元素的集合。这个元素是一个数组。 ID不能等于数组,因此错误。
必须UNNEST数组都是单值与比较:
on drugs_cls_node_view.id in
(select(unnest(array_replace(string_to_array(n.mpath, '/'), '', '0')::bigint[])))
或使用任何阵列,而不是在:
on drugs_cls_node_view.id = ANY
(array_replace(string_to_array(n.mpath, '/'), '', '0')::bigint[])
有可能是在我的代码语法错误,因为我不是postgres家伙,但它应该可能在这里或那里稍微修正:-)
+0
为什么在这个查询中'ANY'与'LIKE'相比较慢? – Wolkodav
+0
我不明白这个问题,但不是一个postgres的人,我不太可能回答它:-)数组和'= ANY'是特殊的PostgreSQL特性。 –
答案是肯定的,你可以使用IN连接两个表。 – jarlh
@jarlh但我得到了异常:'错误:操作符不存在:bigint = bigint []' – Wolkodav
请[将您的查询简化为重现问题所需的最小值](http://*.com/help/mcve) 。这会让问题更加明确。 – IMSoP