【问题标题】:PostgreSQL: Add condition in where clause using CASEPostgreSQL:使用 CASE 在 where 子句中添加条件
【发布时间】:2016-10-06 10:14:16
【问题描述】:

我使用的是 PostgreSQL 8.2,而且我也是 PostgreSQL 的新手。

我必须根据字段的特定值 (49) (activity.type) 在 WHERE 子句中添加一个条件。这是我的查询:

SELECT activity.*
FROM activity 
LEFT JOIN event_types ON activity.customstatusid = event_types.id, getviewableemployees(3222, NULL) AS report 
WHERE 
( 
    CASE WHEN activity.type = 49 THEN 
    'activity.individualid IN(SELECT individualid from prospects where prospects.individualid = activity.individualid)' 
    ELSE 1 
    END 
)
AND activity.date BETWEEN '2016-10-01' AND '2016-10-06' 
AND activity.type IN (21, 22, 49, 50, 37, 199) 
AND (event_types.status = 1 or event_types.status IS NULL);

当我在 PGSQL 的命令行访问中运行上述查询时,出现以下错误:

ERROR:  invalid input syntax for integer: "activity.individualid IN(SELECT individualid from prospects where prospects.individualid = activity.individualid)"

我在这里缺少什么?

【问题讨论】:

  • 您试图在 WHERE 子句中实现的逻辑是什么?
  • 我正在使用 CASE,其中我正在检查 activity.type=49 然后返回另一个子查询,该子查询检查潜在客户表中的 activity.individualid。这是我试图实现的逻辑
  • 显然,您不能这样做,但请查看@donkopotamus 的答案,这看起来可能就是您的想法。
  • 感谢您的宝贵时间,因为我非常需要您的帮助。让我再解释一下。我需要在运行时将一个条件添加到 WHERE 中,该条件将检查 activity.type = 49 是否会针对所有具有 activity.type=49 的记录对 activity.individualid 进行子查询
  • 你的逻辑没有意义,如果从字面上理解,这意味着子查询甚至应该在 WHERE 子句中,更不用说在 CASE 语句中了。如果您想在这里完全清楚,请向我们展示确切的输入和输出。

标签: postgresql case where-clause


【解决方案1】:

将 where 子句实现为:

WHERE (
    activity.type != 49 OR
    activity.individualid IN (
        SELECT individualid from prospects 
        WHERE prospects.individualid = activity.individualid)
)
AND activity.date BETWEEN '2016-10-01' AND '2016-10-06' 
AND activity.type IN (21, 22, 49, 50, 37, 199) 
AND (event_types.status = 1 or event_types.status IS NULL);

第一个子句只有在以下情况下才会为真:

  • activity.type != 49;或
  • activity.type == 49activity.individualid 在子查询中找到。

【讨论】:

  • 我必须对 activity.individualid 使用子查询,仅适用于 activity.type = 49。我还必须包括所有类型的活动。
  • @deltaforce yes ...在本子句中,子查询仅在activity.type = 49时才相关
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2018-02-06
  • 2013-12-23
  • 2023-01-21
相关资源
最近更新 更多