postgresql - 通过 CTE 中的数组列查询
问题描述
我有一个带有数组列的 CTE,并希望通过该 id 数组过滤另一列。
with vars as (
select
(1, 7, 10000) bubble_ids,
'Frank' name
)
select * from walruses
inner join tusks on walruses.id = tusks.walrus_id
where (
name = (select name from vars)
and tusks.bubble_id IN (select bubble_ids from vars)
);
这会产生以下结果:ERROR: operator does not exist: integer = record
我试过取消嵌套——<code>unnest(bubble_ids)——结果是ERROR: record type has not been registered
这样做的正确方法是什么?
解决方案
(1, 7, 10000)
没有定义数组。这是一个创建匿名记录(具有三个字段)的行构造函数。
数组字面量用方括号编写,并且必须以关键字 为前缀array
,例如array[1, 7, 10000]
. 或者,您可以将其写为字符串值:'{1,7,1000}'
当使用 CTE 作为变量/参数的“容器”时,我通常使用交叉连接来使其可供查询访问。那是更少的打字
with vars as (
select
array[1, 7, 10000] bubble_ids,
'Frank' as name --<< you need the AS, because name is a keywod
)
select *
from walruses
inner join tusks on walruses.id = tusks.walrus_id
cross join vars v
where name = v.vars
and tusks.bubble_id = any(v.bubble_ids);
我更喜欢values
子句而不是 aselect
来定义常量值。
with vars(bubble_ids, name) as (
values (array[1, 7, 10000], 'Frank')
)
select *
from walruses
inner join tusks on walruses.id = tusks.walrus_id
cross join vars v
where name = v.vars
and tusks.bubble_id = any(v.bubble_ids);
推荐阅读
- java - 初始化 VM 服务器时发生错误 VM 仅在 ARMv7+ VFP 上受支持
- c# - 如何获取 IMemoryCache 中键的 AbsoluteExpiration DateTimeOffset
- django - Django 'dict' 对象在使用 API 时没有属性 'META' 错误
- flutter - Flutter - 行中溢出时可拖动的文本
- python - 在 gem5 上运行 PARSEC 2.1
- docker - 带有 .net core 3.1 Web 应用程序的 docker 容器问题
- c - 错误:表达式不可分配(分配给 C 指针的一部分)
- c++ - (C++17; Boost) CMake 找不到请求的 Boost 库
- php - 未在 Dreamweaver CS6 中为 PHP 文件呈现实时视图
- vue.js - 如何在 Vue 模板中查看 DRF 中的图像字段