Как заменить значение столбца table1 значением столбца table2 в MySQL выберите левое соединение

#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(), так что большое спасибо!