如何在 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 语句从不同的表中进行选择?的主要内容,如果未能解决你的问题,请参考以下文章