2013-02-05 26 views
2

我們將我們的帳戶信息存儲在PostgreSQL數據庫中。如何在PostgreSQL中作爲布爾列反饋子查詢?

帳戶位於「帳戶」表中,「grp」表中的組中,它們通過將account_id映射到grp_id的「account_grp」表綁定在一起。

我想製作一個查詢,它會給我一個視圖,讓我可以搜索一個組的成員是否是另一個組的成員,即我想在視圖中顯示一個「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位是硬編碼的,不需要改變。

有什麼建議嗎?

+0

什麼是_foobar bit_是硬編碼? –

回答

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

這不是優雅 - 但它完美的作品。助教。 – directhex

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