[英]MySql, return default value if no rows returned
我有一個查詢如下
SELECT cap_id FROM cap_master WHERE
(cap_type = 'Type1' AND cap_desc = 'CapDesc1')
OR (cap_type = 'Type2' AND cap_desc = 'CapDesc2')
OR (cap_type = 'Type3' AND cap_desc = 'CapDesc3')
OR (cap_type = 'Type4' AND cap_desc = 'CapDesc4')
order by cap_type,cap_desc
這將根據where條件返回多行,我要查找的是對於不返回任何行的條件,我應該有一個默認值為'0'。 截至目前,我沒有任何爭議。
例如,如果第三個條件( cap_type ='Type3'和cap_desc ='CapDesc3' )不匹配,我期望輸出如下:
23
34
0
45
我查了一下給出的解決方案
但似乎它們不能在返回的多行上工作。 任何指針將不勝感激。
這是一個小提琴 。
我會用IFNULL做你想做的事。 它未經測試,因為您沒有提供運行查詢的最小數據集:
SELECT IFNULL( (SELECT cap_id FROM cap_master WHERE
(cap_type = 'Type1' AND cap_desc = 'CapDesc1`)
OR (cap_type = 'Type2' AND cap_desc = 'CapDesc2')
OR (cap_type = 'Type3' AND cap_desc = 'CapDesc3')
OR (cap_type = 'Type4' AND cap_desc = 'CapDesc4')
order by cap_type,cap_desc) ,'0');
在這里您可以找到有關IFNULL的更多細節
你想要一個left join
:
select coalesce(cm.cap_id, 0) as cap_id
from (select 'Type1' as cap_type, 'CapDesc1' as cap_desc union all
select 'Type2' as cap_type, 'CapDesc2' as cap_desc union all
select 'Type3' as cap_type, 'CapDesc3' as cap_desc union all
select 'Type4' as cap_type, 'CapDesc4' as cap_desc
) c left join
cap_master cm
on cm.cap_type = c.cap_type and cm.cap_desc = c.cap_desc
order by c.cap_type, c.cap_desc;
如果您需要支持NULL
cap_desc
(這不是原始問題的一部分),您可以執行以下操作:
select coalesce(cm.cap_id, 0) as cap_id
from (
select 'Type5' as cap_type, null as cap_desc
) c left join
cap_master cm
on cm.cap_type = c.cap_type and
(cm.cap_desc = c.cap_desc or cm.cap_desc is null and c.cap_desc is null)
order by c.cap_type, c.cap_desc;
這是一個SQL小提琴。
我能夠弄清楚的解決方案。 不確定這是否會對效率造成太大影響,我猜我一次最多會有20個條件。 如果有其他選擇,請告訴我。
SELECT ifnull((SELECT cap_id FROM cap_master WHERE cap_type = 'Type4' AND
cap_desc = 'CapDesc4' ),0) as cap_id
union all
SELECT ifnull((SELECT cap_id FROM cap_master WHERE cap_type = 'Type7' AND
cap_desc = 'CapDesc7' ),0) as cap_id
union all
SELECT ifnull((SELECT cap_id FROM cap_master WHERE cap_type = 'Type3' AND
cap_desc = 'CapDesc3' ),0) as cap_id
union all
SELECT ifnull((SELECT cap_id FROM cap_master WHERE cap_type = 'Type6' AND
cap_desc = 'CapDesc6' ),0) as cap_id
嘗試CASE功能:)您可以指定應顯示的內容和位置
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.