如何使用 CASE..WHEN 检查子查询结果? [英] How can I use CASE..WHEN to check subquery result?

查看:32
本文介绍了如何使用 CASE..WHEN 检查子查询结果?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的查询:

INSERT INTO mytable(questin_id)
SELECT t1.id
FROM qanda t1 
WHERE (EXISTS (SELECT 1 
               FROM qanda t2 
               WHERE ID = :id 
                 and t1.ID = t2.related)
           or t1.id = :id)
  and Type = 0;

SELECT 语句返回一个 id 并将其插入到 mytable 中.一切都很好.但有时 WHERE 子句上的条件不匹配任何内容并且 SELECT 语句不返回任何内容,因此不会插入任何内容.虽然我总是需要插入一个新行.所以我想检查 SELECT 语句是否匹配任何内容,然后它应该返回 null.这是我的新查询:

The SELECT statement returns an id and it will be inserted into mytable. All fine. But sometimes the conditions on WHERE clause does't match anything and the SELECT statement returns nothing, so nothing will be inserted. While I always need a new row to be inserted. So I want to check if the SELECT statement matched nothing, then it should return null. Here is my new query:

INSERT INTO mytable(questin_id)
SELECT CASE WHEN EXISTS(t1.id) THEN t1.id ELSE NULL END
FROM qanda t1 
WHERE (EXISTS (SELECT 1 
               FROM qanda t2 
               WHERE ID = :id 
                 and t1.ID = t2.related)
           or t1.id = :id)
  and Type = 0;

但它没有按预期工作.有什么想法吗?

But it doesn't work as expected. Any idea?

推荐答案

如果你总是想插入1个值,那么你可以使用聚合:

If you always want to insert 1 value, then you can use aggregation:

INSERT INTO mytable(questin_id)
    SELECT MAX(t1.id)
    FROM qanda t1 
    WHERE (EXISTS (SELECT 1 
                   FROM qanda t2 
                   WHERE t2.ID = :id AND
                         t1.ID = t2.related
                  ) OR
           t1.id = :id
          ) AND
          Type = 0;

当然,这只会返回一行,即使逻辑(除了MAX())会返回多于一行.

Of course, this will return only one row, even if the logic (apart from the MAX()) would return more than one row.

这篇关于如何使用 CASE..WHEN 检查子查询结果?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆