如何在PostgreSQL中将子查询作为布尔列反馈?

4
我们将账户信息存储在PostgreSQL数据库中。
账户信息存放在“accounts”表中,分组信息存放在“grp”表中,它们通过“account_grp”表相互关联,该表将帐户ID映射到组ID。
我正在尝试构建一个查询,以便我可以创建一个视图,让我搜索一个组的成员是否是另一个组的成员,即我想在视图中添加一个“is_in_foobar_group”列,这样我就可以通过 SELECT * FROM my_view WHERE grp_id = 1234; 来获取相关信息。
username | is_in_foobar_group | grp_id 
---------+--------------------+-------
bob      | true               | 1234
alice    | false              | 1234

foobar部分是硬编码的,不需要更改。

有什么建议吗?


硬编码的 foobar bit 是什么? - Clodoaldo Neto
2个回答

7
更简单、更快捷、更方便:
WITH x AS (SELECT 1234 AS foobar)  -- optional, to enter value only once
SELECT a.username
      ,EXISTS (
         SELECT 1 FROM account_grp g 
         WHERE  g.account_id = a.account_id
         AND    g.grp_id = x.foobar
         ) AS is_in_foobar_group
      ,x.foobar AS grp_id
FROM  accounts a, x

1
也许使用EXISTS运算符会有帮助: http://www.postgresql.org/docs/9.2/static/functions-subquery.html#FUNCTIONS-SUBQUERY-EXISTS 我不确定你是否可以在SELECT语句中使用它,而且我没有一个PostgreSQL实例来检查它。最坏的情况下,您将不得不执行两个查询,类似于:
SELECT username, true, grp_id 
FROM accounts a INNER JOIN account_grp g1 on a.account_id = g.account_id
WHERE EXIST (SELECT 1 FROM account_grp g2 
    WHERE g2.account_id = a.account_id and g2.grp_id = [foobar])
UNION
SELECT username, false, grp_id 
FROM accounts a INNER JOIN account_grp g1 on a.account_id = g.account_id
WHERE NOT EXIST (SELECT 1 FROM account_grp g2 
    WHERE g2.account_id = a.account_id and g2.grp_id = [foobar])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接