如何在 Postgres 中使用 CASE 或 IF 语句从不同的表中进行选择?

Posted

技术标签:

【中文标题】如何在 Postgres 中使用 CASE 或 IF 语句从不同的表中进行选择?【英文标题】:How to use CASE or IF-statement in Postgres to select from different table? 【发布时间】:2019-04-27 07:18:30 【问题描述】:

我想从许多表中选择一个。此选择取决于某些条件。我怎样才能做到? 我想它应该是这样的(但它不起作用):

CASE x
    WHEN x=1 THEN
       select Id,Name from table1
    WHEN x=2 THEN
       select Id,Name from table2
    WHEN x=3 THEN
       select Id,Name from table3
END CASE;

【问题讨论】:

x 来自哪里? 应该作为delphi的TFDQuery的参数(或者也可以作为数据库中的参数内存储过程) 为什么不能在 Delphi 中使用IF?为什么你有三个不同的表来存储相同的信息?从您给出的示例中,带有附加列 x 的单个表会更好 这是一种不好的做法 - 在运行时动态创建 SQL。不同的表有不同的信息。只有 2 个字段是常见的 - Id 和 Name 不确定我是否同意 IF 语句在 SELECT 语句的代码中不好,逻辑必须放在某个地方,SQL 或代码,在大多数情况下最好放在可以看到的地方 【参考方案1】:

一种方法:

SELECT id, name
FROM table1
WHERE x = 1
UNION ALL
SELECT id, name
FROM table2
WHERE x = 2
UNION ALL
SELECT id, name
FROM table3
WHERE x = 3

只会返回一个表的数据(如果 x 是这些值中的任何一个)。

【讨论】:

【参考方案2】:

查询所有3个表的低效解决方案,但在代码中模仿switch语句(假设检索到的列是等效的)

declare @inputValue int = 1

SELECT * FROM (
    SELECT 1 [key], Id from table1
    UNION ALL
    SELECT 2, Id from table2
    UNION ALL
    SELECT 3, Id from table3
) x
where x.[key] = @inputValue

【讨论】:

Postgres 的语法无效 我用 SQL Server 模拟了它,认为它是 ANSI T-SQL,我现在明白你不能在 postgres 中声明内联变量,谢谢 谢谢!正确的方法是:SELECT 1 as key, Id from table1

以上是关于如何在 Postgres 中使用 CASE 或 IF 语句从不同的表中进行选择?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 错误:CASE 中不允许设置返回函数

优化 Postgres 中的 case/decode 查询

Postgres:与CASE一起使用ON CONFLICT

带有 CASE 的 Postgres 自定义函数

如何使用 eloquent 在 laravel 迁移中删除 POSTGRES 表或视图?

如何在 switch 语句中使用大于或等于