MySql, вернуть значение по умолчанию, если строки не возвращены - PullRequest
0 голосов
/ 04 июля 2018

У меня есть запрос, как показано ниже

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». На данный момент я не получаю никакой строки для этого.

Например, если 3-е условие ( cap_type = 'Type3' И cap_desc = 'CapDesc3' ) не совпадает, я ожидаю вывод, как показано ниже:

23
34
0  
45

Я проверил данные решения, как

Возвращает значение, если ни одна строка не соответствует

Возвращает значение по умолчанию, если строка не найдена -mysql

Но, похоже, они не работают с возвращением нескольких строк. Любые указатели будут с благодарностью.

Вот Fiddle для игры.

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Решение, которое я смог найти. Не уверен, что это сильно повредит эффективности, я думаю, что за один раз у меня будет максимум 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
0 голосов
/ 04 июля 2018

Я бы использовал 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

0 голосов
/ 04 июля 2018

Вы хотите 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.

0 голосов
/ 04 июля 2018

попробуйте функцию CASE :) Вы можете указать, что и где должно отображаться

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...