在then子句中使用select语句

时间:2014-02-20 05:45:03

标签: mysql case

我正在尝试在then case语句中包含select语句,但输出不符合预期。我知道有不同的方法可以做到这一点,但它可以按照我想做的方式完成。

使用以下示例数据:

create table example(name varchar(10));

insert into example values
('abc'),('bcd'),('xyz');

我已尝试过此查询(此处为fiddle):

select 
case when ((select * from example where name='abc')>=1)
then (select * from example where name='abc')
else (select count(*) from example)
end
from example

但它输出

3
3
3

name='abc'存在时的预期输出

name
abc

如果不是count(*)

提前致谢

5 个答案:

答案 0 :(得分:3)

示例中的子查询是(select * from example where name='abc'),它是结果集,而不是标量值。目前它“有效”,因为它将表中唯一的列与值1进行比较,但如果表中有多列,则会出错。也许您打算(select count(*) from example where name='abc')

类似地,案例中的THEN子句只能用于提供单个列值。为了做到这一点,也许你的意思是:

select 
    case when exists (select * from example where name='abc')
              then (select name from example where name='abc')
         else (select count(*) from example)
    end
from example

但即使在这里你也会得到三行,example中的行和结果集之间没有相关性,所以我不确定你要做什么。我想有更高的目的,所以我会留下它。

答案 1 :(得分:1)

这应该可以解决问题

select distinct
case when ((select count(name) from example where name='abc')>=1)
then (select * from example where name='abc')
else (select count(*) from example)
end
from example

让我知道它是否有效。

答案 2 :(得分:1)

第1点
对于您正在尝试的查询,最后的from example将导致遍历所有记录并获取所有记录。要限制它,您必须删除它。

第2点

您无法将select *条件中的多行truecount(*)条件中的单行false组合在一起。您应该limitselect一行。

示例

select 
  case when ( select count(*) from example where name='abc' ) >= 1
            then ( select * from example where name='abc' limit 1 )
            else ( select count(*) from example )
        end as name

答案 3 :(得分:1)

无需担心复杂的查询。

SELECT COUNT(*) AS ct 
FROM example 
GROUP BY name = 'abc' 
ORDER BY name = 'abc' DESC 
LIMIT 1;

如果你真的想使用CASE只是为了使用它:

SELECT 
   CASE name 
      WHEN 'abc' THEN 'abc' 
      ELSE 'others' 
   END AS name, COUNT(*) AS ct
FROM example 
GROUP BY name = 'abc' 
ORDER BY name = 'abc' DESC 
LIMIT 1;

答案 4 :(得分:0)

尝试以下查询,即使您输入第二个重复行作为值'abc'也可以使用。根据您的查询条件(> = 1),大多数建议的查询将无效,因为您输入此重复行,名称可能有多行为“abc”。

SELECT 
CASE WHEN b.cnt>=1 
THEN a.name 
ELSE (SELECT COUNT(*) FROM EXAMPLE) 
END 
FROM (SELECT DISTINCT NAME FROM EXAMPLE WHERE NAME='abc') a 
JOIN (SELECT NAME,COUNT(*) AS cnt FROM EXAMPLE WHERE NAME='abc') b 
ON a.name=b.name