2014-02-20 50 views
0

我試圖在的case語句中包含select語句,但輸出與預期不符。我知道有不同的方法來做到這一點,但可以按照我試圖做的方式來完成。在case的then子句中使用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(*)

預先感謝

+1

關於SO的問題應該是自包含的。我已經爲你提供了來自小提琴的查詢和信息。 –

+0

好的謝謝。我認爲提供小提琴鏈接也很好。但下次會小心:) –

+0

@Gone:檢查我的答案。 –

回答

2

你在該示例子查詢是(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

這應該做的伎倆

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 

讓我知道,如果它的工作原理。

1

1點
對於查詢,你想,在最後的from example將導致遍歷所有的記錄和獲取的所有記錄。要限制這一點,你必須刪除它。

點2

你不能在true條件與單行count(*)false條件相結合的多列select *。你應該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 
1

沒有必要用複雜的查詢來打擾。

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

如果你真的想使用情況下,只需使用它的緣故:

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; 
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