我正在尝试在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(*)
提前致谢
答案 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 *
条件中的多行true
与count(*)
条件中的单行false
组合在一起。您应该limit
到select
一行。
示例 :
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