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

时间:2013-02-05 15:13:13

标签: postgresql subquery

我们将帐户信息存储在PostgreSQL数据库中。

帐户位于“帐户”表中,“grp”表中的组,并且它们通过“account_grp”表绑定在一起,该表将account_id映射到grp_id。

我正在尝试制作一个查询,它会给我一个视图,让我可以搜索一个组的成员是否是另一个组的成员,即我在视图中想要一个“is_in_foobar_group”列,所以我可以{{ 1}}然后回来

SELECT * FROM my_view WHERE grp_id = 1234;

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

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

更简单,更快捷,更方便:

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 :(得分:1)

也许使用EXISTS运算符会有所帮助: http://www.postgresql.org/docs/9.2/static/functions-subquery.html#FUNCTIONS-SUBQUERY-EXISTS

我不确定你是否可以在SELECT语句中使用它,我没有PostgreSQL实例来检查它。 最糟糕的情况是你必须做2个查询,例如:

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])