使用IN/ANY运算符对比UUID与UUID数组时Pgadmin报错求助
问题原因及解决办法
错误提示说明当前执行的预编译语句期望单个uuid类型参数,但你传递的是uuid[]数组——大概率是之前创建的同名预编译语句没有被正确覆盖,残留了旧的参数定义。
解决步骤:
- 先清理旧的预编译语句:
DEALLOCATE testquery;
- 重新创建预编译语句(推荐用
ANY的写法,比UNNEST更简洁高效):
PREPARE testquery (UUID[]) AS SELECT ven.initialization_status, ven.is_degraded, s.hostname, s.operational_status FROM virtual_edge_node ven LEFT JOIN virtual_edge_node_reported_status s ON ven.id = s.virtual_edge_node_id LEFT JOIN virtual_edge_group veg ON ven.ve_group_id = veg.id WHERE ($1 IS NULL OR ven.site_id = ANY($1) OR (ven.is_inherited_site = true AND veg.site_id = ANY($1)));
- 执行查询,注意不要加多余引号,直接传递数组:
EXECUTE testquery(ARRAY['4de9127e-8178-46b3-b26f-3d61cdc9b28c','4de9127e-8178-46b3-b26f-3d61cdc9b28d']::UUID[]);
或者用另一种数组写法,效果一致:
EXECUTE testquery('{"4de9127e-8178-46b3-b26f-3d61cdc9b28c","4de9127e-8178-46b3-b26f-3d61cdc9b28d"}'::uuid[]);
额外说明:
ANY($1)直接作用于数组的写法比IN (SELECT UNNEST($1))更高效,PostgreSQL对前者的查询计划优化更好。- 确保
ven.site_id和veg.site_id字段确实是uuid类型,避免因字段类型不匹配导致隐性转换错误。
内容的提问来源于stack exchange,提问作者NeilB
相关产品推荐
相关产品推荐

