首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有条件地从postgresql中的单独表中选择一列

有条件地从postgresql中的单独表中选择一列
EN

Stack Overflow用户
提问于 2018-11-29 00:52:42
回答 1查看 50关注 0票数 0

我有一个包含通知、事件和组织的表格。通知有一个名为event-id的列,该列可以为空。我正在尝试选择通知,对于有事件的通知使用organization.timezone,并且只选择没有时区(或null)的没有事件的通知。下面是一个表格的示例(删除了不相关的字段)

通知表

代码语言:javascript
复制
id | message | event-id

0  |  "a"    | 0

1  |  "b"    | nil

事件表

代码语言:javascript
复制
id | org-id 

0  |  0    

1  |  1

组织表

代码语言:javascript
复制
id | timezone

0  |  "Eastern"    

1  |  "Other" 

我的查询应该返回

代码语言:javascript
复制
id | message | timezone

0  |  "a"    | "eastern"

1  |  "b"    | nil

我的尝试如下所示(翻译自clojure蜜表,如果有拼写错误,非常抱歉):

代码语言:javascript
复制
Select notifications.id, notifications.message, (case when notifications.event-id then organizations.timezone end) 
where (or (= notifications.event-id nil) 
          (and (= notifications.event-id events.id)
               (= events.org-id organizations.id))
end

但我得到了

我的查询应该返回

代码语言:javascript
复制
id | message | case

0  |  "a"    | "eastern"

1  |  "b"    | nil

1  |  "b"    | nil

我如何修复这个问题,使我不会为每个event-id为空的通知获取重复值?

EN

回答 1

Stack Overflow用户

发布于 2018-11-29 04:18:32

翻译后的SQL是无效的,所以很难说为什么会有重复的结果,但这里有一些有效的SQL,它们将返回您想要的结果,希望您能将其转换为原始格式。

设置

代码语言:javascript
复制
CREATE TABLE notifications (
  "id" INTEGER,
  "message" VARCHAR(3),
  "event-id" INTEGER
);

INSERT INTO notifications
  ("id", "message", "event-id")
VALUES
  ('0', 'a', '0'),
  ('1', 'b', NULL);

CREATE TABLE events (
  "id" INTEGER,
  "org-id" INTEGER
);

INSERT INTO events
  ("id", "org-id")
VALUES
  ('0', '0'),
  ('1', '1');

CREATE TABLE organizations (
  "id" INTEGER,
  "timezone" VARCHAR(9)
);

INSERT INTO organizations
  ("id", "timezone")
VALUES
  ('0', 'Eastern'),
  ('1', 'Other');

查询

代码语言:javascript
复制
SELECT n.id, n.message, o.timezone
FROM notifications n
LEFT JOIN events e
    ON e.id = n."event-id"
LEFT JOIN organizations o
    ON o.id = e."org-id";

结果

代码语言:javascript
复制
| id  | message | timezone |
| --- | ------- | -------- |
| 0   | a       | Eastern  |
| 1   | b       |          |

DB Fiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53524421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档