【问题标题】:How to use CASE or IF-statement in Postgres to select from different table?如何在 Postgres 中使用 CASE 或 IF 语句从不同的表中进行选择?
【发布时间】: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 或代码,在大多数情况下最好放在可以看到的地方

标签: sql postgresql case


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-06
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    相关资源
    最近更新 更多