sql - PostgreSQL 中的条件 CTE
问题描述
我正在尝试编写一个动态查询。我试图尽可能简化这一点。@Condition
并且@Filter
是查询的动态输入。
有两种情况:
- 如果
@Condition
是TRUE
,则不过滤data
任何存在的metadata
- 否则,找到
metadata
与某个文件管理器匹配的行,然后过滤data
那些。
伪代码有点像这样:
WITH selected_metadata AS (
IF (@Condition = TRUE) {
-- Do not filter on metadata
SELECT NULL;
}
ELSE {
-- Find the matching metadata rows
SELECT id FROM metadata WHERE field = @Filter
}
)
SELECT
*
FROM data
WHERE
(
-- Ignore the metadata filter
selected_metadata IS NULL
OR
-- Filter on metadata
data.metadataid IN (selected_metadata)
)
...more filters
我认为没有 CTE 可能有更简单的方法可以做到这一点,但由于查询在现实生活中的样子,我认为我需要将其拆分以最小化复杂性。
解决方案
我认为您可以尝试在 where 而不是直接在 CTE 中设置这些条件。
SELECT
*
FROM data
WHERE
(
-- Ignore the metadata filter
@Condition = TRUE
OR
-- Filter on metadata
@Condition = FALSE AND data.metadataid IN (SELECT ID FROM selected_metadata AND field = @Filter)
)
...more filters
推荐阅读
- javascript - 有没有办法从 html 的画布中提取原点坐标?
- opencv - 有什么方法可以从完整视频中检测和剪切出真实的视频部分
- c# - Prism InvokeCommandAction 可以与 Microsoft.Xaml.Behaviors.Wpf 一起使用吗
- antlr4 - ANTLR 将可选标签优先于非可选标签
- python - Python Post Request 为以下 post 请求返回 422 错误
- php - Symfony / API 平台 - 多对多关系仅以一种方式工作
- r - 将行映射到 R 中的列列表
- sql - 错误:数字类型的输入语法无效:“”
- python - 使用 pem 密钥和客户端证书的 KAFKA SSL 连接
- java - 当用户停止在 Java TextArea 中输入时如何在另一个线程中保存和拼写检查