Я использую оператор 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 = ?
''
, так иNULL
для строк в таблице, но в этом конкретном запросе вы обрабатываете их одинаково. Если они означают одно и то же, следует использовать только один из двух вариантов (что можно обеспечить с помощью проверочного ограничения или триггера). Если бы вы использовали толькоNULL
, вы могли бы простоselect coalesce(ug.permissions, g.permissions), coalesce(ug.display, g.display) ...
. - person Thorsten Kettner   schedule 06.10.2020