【问题标题】:How to return multiple values when using SELECT EXISTS in postgresql在 postgresql 中使用 SELECT EXISTS 时如何返回多个值
【发布时间】:2013-12-27 14:26:38
【问题描述】:

我有以下 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'
   );

但我收到以下错误:

错误:FROM 中的子查询必须有别名 LINE 2: ( ^ 提示:例如,FROM (SELECT ...) [AS] foo。

编辑 2

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'
   ) AS x;

【问题讨论】:

  • 我不明白这个问题。如果您知道正确的方法是从子选择中获取值,那么您真正要问的是什么?
  • 我在问我是否可以返回两个值,一个来自 EXISTS,一个来自子查询。该方法的一些使用者可能只需要 Exists() 的布尔值,而其他人则需要两者。在这里我能做的越多,在调用这个sql查询的方法中我要做的就越少。
  • 您可以在子查询中返回值,然后从中得出存在的值。

标签: sql postgresql


【解决方案1】:
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'
LIMIT  1;  -- may or may not be needed.

这符合您的要求:您得到两列。但是如果什么也没找到,你会得到no row

如果你想要一行,即使没有找到,你也需要一个子查询:

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;

【讨论】:

  • 嗯.. 我刚刚复制并粘贴了您的代码,但是... 我收到一条错误消息,指出 FROM 中的子查询必须有别名.. 请查看我帖子中的编辑 1
  • @dot:子查询的别名丢失。而且我的解释有点不正确,也是固定的。
  • k.我想我们大约在同一时间发布。我刚刚添加了一个编辑 2... 这有点类似于你的新帖子。
  • 我喜欢!非常简单和自我记录
  • 唯一酷的就是如果它不存在我仍然可以得到 0。
猜你喜欢
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多