SQL преобразует два столбца адреса в один

у меня есть стол

SQL преобразует два столбца адреса в один

В результате я ожидаю только два столбца Имя и адрес, для add1 и aad2, если они похожи, я хочу показать их только один раз по адресу, а для разных aad1 и add2 я хочу показать их дважды в двух разных строках. Я ожидаю этот вывод

SQL преобразует два столбца адреса в один

Пожалуйста, укажите в своем вопросе базу данных, с которой вы работаете: mysql, oracle, sqlserver...?

GMB 11.12.2020 11:35
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Портативный подход использует union all, чтобы развернуть столбцы в строки и удалить дубликаты:

select name, add1 as add from mytable
union all select name, add2 from mytable where add2 <> add1

В зависимости от вашей базы данных может быть лучший вариант. Типичным решением является боковое соединение, но синтаксис сильно зависит от базы данных (и не все из них реализуют эту функцию).


Обновлено: в SQL Server:

select t.name, a.add
from mytable t
cross apply (values (add1), (case when add1 <> add2 then add2 end)) a(add)
where a.add is not null

чувак, это сработало, я не знаю, как, но это сработало, спасибо!!

shubham 11.12.2020 12:24

Добро пожаловать @shubham. Поскольку вы, наконец, отметили свой вопрос SQL Server, я добавил (лучшее) решение для этой базы данных.

GMB 11.12.2020 12:45

извините за поздний ответ новое о переполнении стека

shubham 17.02.2021 21:34

В базе данных oracle и sql-сервере оператор объединения удаляет повторяющиеся строки

select name, add1 as address from mytable
union
select name, add2 from mytable
Ответ принят как подходящий

Мне нравится отменять поворот с помощью cross apply. В вашем случае вы можете использовать такую ​​логику:

select t.name, v.add
from t cross apply
     (values (1, add1), (2, add2)) v(n, add)
where n = 1 or (n = 2 and t.add1 <> t.add2);

То есть всегда брать первый адрес. Возьмите второй, когда он отличается от первого.

Другие вопросы по теме