簡體   English   中英

MySql,如果沒有返回行,則返回默認值

[英]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

我查了一下給出的解決方案

如果沒有行匹配則返回一個值

如果找不到行-mysql,則返回默認值

但似乎它們不能在返回的多行上工作。 任何指針將不勝感激。

這是一個小提琴

我會用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功能:)您可以指定應顯示的內容和位置

https://www.w3schools.com/sql/func_mysql_case.asp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM