Как объединить данные из двух столбцов в один без использования UNION и JOIN?
Такие вопросы с завидной регулярностью появляются на страницах различных форумов. К слову сказать, для меня до сих пор остается загадкой, почему при этом ставится дополнительное условие не использовать UNION и/или JOIN. Могу лишь предположить, что это вопросы, которые задают на собеседовании при приеме на работу.
Лирическое отступление. Догадываюсь, как ответил бы на этот вопрос Джо Селко: налицо ошибка проектирования, состоящая в том, что один атрибут расщеплен на два. Однако оставим в стороне вопросы проектирования и перейдем к решению этой задачи.
Создадим тестовую таблицу и добавим в нее немного данных:
Итак, имеется таблица T, которая содержит два столбца с данными одного типа:
Требуется получить следующий результат:
Мне известны три способа, реализуемых стандартными средствами интерактивного языка SQL.
1. UNION ALL
Очевидное решение, не требующее комментариев. Заметим лишь, что UNION не подходит для решения этой задачи, т.к. устраняет дубликаты.
2. FULL JOIN
Чтобы не потерять дубликаты, находящиеся в разных столбцах, выполним полное соединение (FULL JOIN) по заведомо ложному предикату, скажем, 1 = 2:
Далее используем функцию COALESCE, которая даст нам все, что нужно:
3. UNPIVOT
Конструкции PIVOT и UNPIVOT появились в последних версиях стандарта SQL и были реализованы SQL Server, начиная с версии 2005. Первая из них позволяет значения в столбце вытянуть в строку, а вторая поможет нам выполнить обратную операцию:
Значения из столбцов col1 и col2 собираются в одном столбце col вспомогательной таблицы unpvt. Однако есть одна особенность в использовании операторов PIVOT и UNPIVOT — они не учитывают NULL-значения. Результат последнего запроса будет таким:
Это препятствие на пути к решению нашей задачи можно преодолеть, если заменить NULL-значение на входе оператора UNPIVOT псевдозначением, т.е. значением, которого заведомо не может быть в исходных данных, а потом выполнить обратное преобразование:
Здесь COALESCE(colx,777) заменяет NULL-значения в столбце colx на 777, а функция NULLIF(col,777) выполняет обратное преобразование.
Последнее решение дает нам требуемый результат, однако содержит один изъян — значение 777 может рано или поздно появиться в данных, что будет приводить к неверным результатам. Чтобы устранить этот огрех, можно использовать значение другого типа, которого заведомо не может присутствовать в целочисленном столбце, например, символ ‘x’. Естественно, чтобы применить этот подход, для совместимости типов целочисленный тип столбцов следует конвертировать к символьному типу, выполнив при необходимости обратное преобразование конечного результата:
Несколько слов об эффективности представленных решений. Согласно плану выполнения запроса, основные затраты обусловлены чтением данных (операция сканирования таблицы — Table scan). Для двух первых решений сканирование выполняется дважды, в то время как для последнего (UNPIVOT) — один раз, чем и обусловлено его двойное преимущество в производительности.
Комментарии
Есть еще один вариант, который я использую:
Декартово произведение таблицы T с выборкой из 2-х строк дает «удвоение» (каждая строка таблицы повторяется 2 раза — для а=1 и а=2). Для первого случая берем значение из col1, а для второго — из col2.
Тут, конечно, есть и union, и join, но, по-моему, в данном вопросе интересует именно единственное сканирование таблицы.
click fraud protection
В некоторых случаях нам может потребоваться объединить значения из нескольких столбцов, чтобы сформировать одно строковое значение. Например, мы можем объединить значения из столбцов FirstName, MiddleInitial и LastName, чтобы создать столбец, содержащий полные имена.
В этой статье мы рассмотрим различные методы объединения значений из столбцов в одно строковое значение.
Метод 1 – Плюс Оператор
Первый метод объединения значений в SQL Server — использование оператора «плюс». Он берет предоставленные строки и объединяет их, чтобы сформировать один строковый литерал.
Упрощенный пример показан ниже:
ВЫБИРАТЬ «Линукс» + ‘Намекать’ КАК РЕЗУЛЬТАТ ;
Приведенный выше запрос берет первую строку и объединяет ее со второй, чтобы получить одно строковое значение, как показано ниже:
LinuxПодсказка
( 1 РЯД затронутый )
Оператор плюс принимает более двух строковых литералов. Например:
Фрагмент выше должен ВОЗВРАЩАТЬСЯ :
Добро пожаловать: LinuxHint
( 1 РЯД затронутый )
Вы также можете использовать оператор «плюс» для объединения значений столбца. Например, рассмотрим таблицу, в которой у нас есть таблица со столбцами FirstName, MiddleInitial и LastName.

Мы можем использовать оператор «плюс» для создания имен пользователей на основе столбцов MiddleInitial и LastName.
Рассмотрим пример запроса, показанный ниже:
ВЫБИРАТЬ вершина 10 *, ( Второй инициал + ‘.’ + Фамилия ) имена пользователей ОТ Клиенты ГДЕ Второй инициал ЯВЛЯЕТСЯ НЕТ НУЛЕВОЙ ;
Приведенный выше пример запроса возвращает результат в виде:

Используя оператор «плюс», мы объединяем значения различных столбцов, чтобы получить одно строковое значение.
Метод 2 — функция SQL Server Concat()
SQL Server также предоставляет функцию для замены оператора плюс. Concat позволяет объединить две строки или значения столбца, чтобы сформировать один строковый литерал.
Рассмотрим приведенный ниже пример, в котором функция concat используется для замены предыдущей операции.
ВЫБИРАТЬ вершина 10 *, конкат ( Второй инициал , ‘.’ , Фамилия ) имена пользователей ОТ Клиенты ГДЕ Второй инициал ЯВЛЯЕТСЯ НЕТ НУЛЕВОЙ ;
Приведенный выше запрос должен вернуть аналогичный результат:

Закрытие
В этой статье мы рассмотрели два основных способа объединения строковых литералов или значений в столбцах таблицы.
Как объединить два столбца в один sql

Для объединения двух столбцов воспользуйтесь такой командой:

Eto pri select, a esli ya hochu eto zapisat’ v stolbec?
Рекомендуемые курсы
Похожие вопросы
- postgres
- count
- О нас
- Карьера в Хекслете
- Хекслет Колледж
- Условия использования
- Соглашение об обработке ПД
- Оферта
- Акции
- 8 800 100 22 47 бесплатно по РФ
- +7 495 085 28 38 бесплатно по Москве
- support@hexlet.io
ООО «Хекслет Рус» 432071, г. Ульяновск, пр-т Нариманова, дом 1Г, оф. 23 ОГРН 1217300010476
Упражнения по SQL
SELECT (обучающий этап) задачи по SQL запросам 120 штук, DML 10 шт. Дистанционное обучение языку баз данных SQL. Интерактивные упражнения и тестирование по операторам SELECT,INSERT,UPDATE,DELETE языка SQL. SQL remote education. SQL statements exercises. Подзапросы, Соединение таблиц, Функции SQL, Введение в SQL, Скачать книги по SQL. Команды SQL,CREATE SEQUENCE,CREATE SYNONYM,CREATE USER,CREATE VIEW,Create Table,DROP,GRANT,INSERT,REVOKE,SET ROLE,SET TRANSACTION,SQL ALTER TABLE,SQL команды.