【问题标题】:Multiple select exists in a single statement单个语句中存在多个选择
【发布时间】:2017-09-07 14:48:25
【问题描述】:

我有以下代码:

DROP SCHEMA IF EXISTS s CASCADE;  

CREATE SCHEMA s;

CREATE TABLE s.t1 (
    id1 BigInt,
    id2 BigInt,
    CONSTRAINT "pk1" PRIMARY KEY (id1)
)   
WITH(OIDS=FALSE);


INSERT INTO s.t1 (id1, id2) VALUES (2, 22);
INSERT INTO s.t1 (id1, id2) VALUES (3, 22);
INSERT INTO s.t1 (id1, id2) VALUES (4, 24);


SELECT EXISTS (SELECT TRUE FROM s.t1 t1 WHERE t1.id1 = 2,  
SELECT EXISTS (SELECT TRUE FROM s.t1 t1 WHERE t1.id2 = 22);

有没有办法在单个语句中检查多个条件。

我正在寻找两个单独列中的值。 我一直在寻找的答案是这样的:

 bool | bool 
------+------
 t    | t
(1 row)

我得到了解决方案:

SELECT EXISTS(SELECT TRUE FROM s.t1 t1 WHERE t1.id1 = 6), 
EXISTS(SELECT TRUE FROM s.t1 t1 WHERE t1.id2 = 22);

输出:

 exists | exists 
 --------+--------
  f      | t
 (1 row)

【问题讨论】:

    标签: postgresql select multiple-columns exists


    【解决方案1】:

    怎么样

    SELECT max(x.t2) as t2,
           max(x.t22) as t22
    FROM ((SELECT t1.id1 as t2, null as t22 FROM s.t1 t1 WHERE t1.id1 = 2)
            UNION
          (SELECT null as t2, t1.id2 as t22 FROM s.t1 t1 WHERE t1.id2 = 22)) as x;
    

    Demo

    【讨论】:

    • 这给了我一个单列。这个想法是有多个这样的条件并在一个查询中得到结果。
    • 我的错,我刚刚编辑了我的答案但是现在,我不确定你要做什么
    • 如果您想检索两列数据,您可能应该在子查询之间使用UNION
    • 感谢您的提示。我根据您的回答得到了解决方案。
    【解决方案2】:
    SELECT max( case when id1=2 then 'EXISTS' ELSE 'DOESN''T EXISTS' end) id1_2,
           max( case when id2=22 then 'EXISTS' ELSE 'DOESN''T EXISTS' end) id2_22,
           max( case when id2=33 then 'EXISTS' ELSE 'DOESN''T EXISTS' end) id2_33
    FROM s.t1
    

    演示:http://sqlfiddle.com/#!17/85c47/11

    |  id1_2 | id2_22 |         id2_33 |
    |--------|--------|----------------|
    | EXISTS | EXISTS | DOESN'T EXISTS |
    

    【讨论】:

      【解决方案3】:

      EXISTS 产生一个布尔值,您可以直接使用它:


      SELECT
        EXISTS (SELECT * FROM s.t1 x1  
              WHERE x1.id1 = 2)       AS ex1
        , EXISTS (SELECT * FROM s.t1 x2
              WHERE x2.id2 = 22)      AS ex2
              ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 2013-08-31
        • 1970-01-01
        • 2016-10-18
        相关资源
        最近更新 更多