#mysql #sql #join #select #case
#mysql #sql #Присоединиться #выберите #случай
Вопрос:
Допустим, у меня есть две таблицы MySQL:
Столбцы table1 (шаблоны): id_template, name, col3, col4, …
Столбцы table2 (псевдонимы): id_alias, id_template_orig, id_user, псевдоним
Я хочу выбрать строку из table1 (шаблоны), включая все столбцы (*). В том же операторе select я хочу проверить, сохранил ли текущий пользователь псевдоним для исходного имени шаблона в table2 (псевдонимы). Нет проблем с включением столбца псевдонима в строку результатов с помощью LEFT JOIN, но мне интересно, есть ли способ заменить исходное значение столбца name, уже выбранное из table1, значением псевдонима table2.
Итак, вот выбор до сих пор:
SELECT table1.*, table2.alias,
CASE WHEN table2.alias IS NULL THEN table1.name ELSE table2.alias END name
FROM table1
LEFT JOIN table2 ON table2.id_template_orig=table1.id_template
WHERE table1.id_template='1'
Это работает почти нормально, за исключением того, что возвращает два столбца имен вместо замены первого на второй
Я знаю, что не рекомендуется выбирать все столбцы с помощью table1. * и моя цель была бы достигнута, если вместо этого использовать select id_template, col3, col4, … из table1, но иногда * просто упрощает задачу.
Комментарии:
1. Не используйте table1.*. Перечислите все столбцы table1, кроме name.
2. Да, я знаю, что это один из способов сделать это, но мне особенно интересно, возможно ли достичь этого также с помощью *
Ответ №1:
К сожалению, в MySQL нет возможности выбрать *
только один столбец — как, например, в BigQuery, который поддерживает select * except (name)
.
У вас есть два варианта:
-
не используйте
select table1.*
; вместо этого перечислите все нужные столбцы, ожидайтеname
-
используйте
select *
и дайте другой псевдоним сгенерированному столбцу.
Второй вариант может быть вашим лучшим выбором, поскольку вы четко указали, что хотите сохранить select table1.*
. Это будет выглядеть так:
select t1.*, t2.alias, coalesce(t2.alias, t1.name) as new_name
from table1 t1
left join table2 t2 on t2.id_template_orig = t1.id_template
where t1.id_template = 1
Примечания:
-
coalesce()
можно просто заменить вашеcase
выражение здесь -
псевдонимы таблиц облегчают запись и чтение запроса
Комментарии:
1. Спасибо! Итак, я закончил перечислением столбцов вместо использования *. Я не знал о coalesce(), так что большое спасибо!