sql переписать для оператора case

Я использую оператор case и задаюсь вопросом, есть ли лучший способ написать это?

Это то, что у меня сейчас есть, и оно работает:

select 
CASE WHEN ug.permissions = "" OR ug.permissions IS NULL
THEN
    g.permissions
ELSE
     ug.permissions 
END as permissions,
CASE WHEN ug.display = "" OR ug.display IS NULL
THEN
    g.display
ELSE
     ug.display 
END as display
from system.users_groups as ug
inner join system.groups as g on ug.group_id = g.id
where ug.user_id = ?

Я думал о чем-то более подобном, но у меня очень мало опыта работы с операторами case в sql:

select 
CASE WHEN ug.permissions = "" OR ug.permissions IS NULL
THEN
    g.permissions,
    g.display
ELSE
    ug.permissions,
    ug.display
END
from system.users_groups as ug
inner join system.groups as g on ug.group_id = g.id
where ug.user_id = ?

person K3NN3TH    schedule 15.09.2014    source источник
comment
Вы разрешаете как '', так и NULL для строк в таблице, но в этом конкретном запросе вы обрабатываете их одинаково. Если они означают одно и то же, следует использовать только один из двух вариантов (что можно обеспечить с помощью проверочного ограничения или триггера). Если бы вы использовали только NULL, вы могли бы просто select coalesce(ug.permissions, g.permissions), coalesce(ug.display, g.display) ....   -  person Thorsten Kettner    schedule 06.10.2020


Ответы (1)


Я предпочитаю следующее:

SELECT
  g.id,
  IFNULL(NULLIF(ug.permission, ''), g.permission),
  IFNULL(NULLIF(ug.display, ''), g.display)
FROM groups AS g

INNER JOIN users_group AS ug
ON ug.group_id = g.id

SQLFiddle

person Andrey Bakharev    schedule 15.09.2014