如何在postgresql中使用SELECT时返回多个值

如何在postgresql中使用SELECT时返回多个值,sql,postgresql,Sql,Postgresql,我有以下SQL查询: SELECT EXISTS (SELECT r.id FROM Rules r INNER JOIN rule_t c on c.id=r.rule_t.id INNER JOIN user u on u.id = r.user_id WHERE u.fmnum='2813' AND c.name='default') ::int 是否有一种方法可以修改它,以便返回两个值:EXISTS方法中的INT和r.id 我知道我可以更改查询以便删除EXISTS方法。。。如果子选择

我有以下SQL查询:

SELECT EXISTS (SELECT r.id FROM Rules r INNER JOIN rule_t c on c.id=r.rule_t.id 
INNER JOIN user u on u.id = r.user_id
WHERE u.fmnum='2813'
AND c.name='default') ::int
是否有一种方法可以修改它,以便返回两个值:EXISTS方法中的INT和r.id

我知道我可以更改查询以便删除EXISTS方法。。。如果子选择返回任何东西,那么我知道记录存在。。。但我只是想知道是否有可能做到以上几点

谢谢

编辑1

我正在pgadmin3的新查询窗口中测试以下代码

SELECT *
FROM  (
   SELECT TRUE, r.id
   FROM   rules  r
   JOIN   rule_t c on c.id = r.rule_t.id 
   JOIN   user   u on u.id = r.user_id
   WHERE  u.fmnum = '2813'
   AND    c.name = 'default'
   );
但我得到了以下错误:

错误:发件人中的子查询必须具有别名行2: ^提示:例如,从选择。。。[作为]福

编辑2

这就是你想要的:你得到两列。但如果什么也没找到,你就不会吵架

如果需要一行,即使找不到任何内容,也需要一个子查询:

SELECT sub.t_id IS NOT NULL AS does_exist, sub.id
FROM  (SELECT 1) x  -- dummy to guarantee 1 row
LEFT JOIN (         -- LEFT JOIN is crucial
    SELECT r.id
    FROM   rules  r
    JOIN   rule_t c on c.id = r.rule_t.id 
    JOIN   user   u on u.id = r.user_id
    WHERE  u.fmnum = '2813'
    AND    c.name = 'default'
    LIMIT  1        -- may or may not be needed.
    ) ON TRUE;      -- join condition is always true
或者,更简单/更快:

SELECT 1 AS does_exist, r.id
FROM   rules  r
JOIN   rule_t c on c.id = r.rule_t.id 
JOIN   user   u on u.id = r.user_id
WHERE  u.fmnum = '2813'
AND    c.name = 'default'

UNION  ALL
SELECT 0, NULL
LIMIT  1;

我不明白这个问题。如果您知道正确的方法是从subselect获取值,那么您真正想问的是什么?我想问的是是否可以返回两个值,一个来自EXISTS,另一个来自subquery。该方法的一些使用者可能只需要Exists中的布尔值,而其他使用者则需要两者。在这里我能做的越多,在调用此sql查询的方法中所做的就越少。您可以在子查询中返回值,然后从该.Hm.中派生exists值。。我只是复制并粘贴了你的代码,但是。。。我收到一条错误消息,指出FROM中的子查询必须有别名。。请在我的网站中查看编辑1post@dot:缺少子查询的别名。我的解释有点不正确,这也是固定的。我想我们大概是在同一时间发布的。我刚刚添加了一个编辑2。。。这有点像你的新帖子。我喜欢它!非常简单和自我记录唯一酷的事情是如果它不存在,我仍然可以得到0。
SELECT sub.t_id IS NOT NULL AS does_exist, sub.id
FROM  (SELECT 1) x  -- dummy to guarantee 1 row
LEFT JOIN (         -- LEFT JOIN is crucial
    SELECT r.id
    FROM   rules  r
    JOIN   rule_t c on c.id = r.rule_t.id 
    JOIN   user   u on u.id = r.user_id
    WHERE  u.fmnum = '2813'
    AND    c.name = 'default'
    LIMIT  1        -- may or may not be needed.
    ) ON TRUE;      -- join condition is always true
SELECT 1 AS does_exist, r.id
FROM   rules  r
JOIN   rule_t c on c.id = r.rule_t.id 
JOIN   user   u on u.id = r.user_id
WHERE  u.fmnum = '2813'
AND    c.name = 'default'

UNION  ALL
SELECT 0, NULL
LIMIT  1;