Объединить вывод 2 столбцов в 1 столбец
Допустим надо объединить вывод и ‘адрес’ и ‘второй_адрес’ в одну колонку ‘все_адреса’.
SELECT адреса1 . адрес as первый_адрес , адреса1 . второй_адрес as второй_адрес
SELECT ( адреса1 . адрес , адреса1 . второй_адрес ) as все_адреса
Как и можно ли это сделать?
![]()
Даже скорее так:
т.к. в первом варианте, если в одном из 2 столбцов будет NULL то вернется NULL, второй вариант пустые значения проигнорирует
Как объединить данные из двух столбцов в один без использования 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, но, по-моему, в данном вопросе интересует именно единственное сканирование таблицы.
Как объединить данные из двух столбцов в один без использования UNION и JOIN?
Как объединить данные из двух столбцов в один без использования UNION и JOIN?
Моисеенко С.И. (22-08-2008)
Такие вопросы с завидной регулярностью появляются на страницах различных форумов. К слову сказать, для меня до сих пор остается загадкой, почему при этом ставится дополнительное условие не использовать UNION и/или JOIN. Могу лишь предположить, что это вопросы, которые задают на собеседовании при приеме на работу.
Лирическое отступление. Догадываюсь, как ответил бы на этот вопрос Джо Селко: налицо ошибка проектирования, состоящая в том, что один атрибут расщеплен на два. Однако оставим в стороне вопросы проектирования и перейдем к решению этой задачи.
Создадим тестовую таблицу и добавим в нее немного данных:
UNION ALL SELECT 1, 3
UNION ALL SELECT NULL, NULL
UNION ALL SELECT NULL, 2
Итак, имеется таблица T, которая содержит два столбца с данными одного типа:
SELECT col1, col2
Требуется получить следующий результат:
Мне известны три способа, реализуемых стандартными средствами интерактивного языка SQL.
Очевидное решение, не требующее комментариев. Заметим лишь, что UNION не подходит для решения этой задачи, т.к. устраняет дубликаты.
SELECT col1 col FROM T
SELECT col2 FROM T
Читайте также
Western Union
Western Union Western Union – это уникальная система, осуществляющая денежные переводы по всему земному шару. С ее помощью отправить и получить деньги можно более чем в 190 странах. Поражает скорость перевода – благодаря использованию собственной всемирной компьютерной сети деньги
Как объединить компьютеры в локальную сеть?
Как объединить компьютеры в локальную сеть? Характерной особенностью операционной системы Windows 7 является то, что процесс создания локальных сетей в ней максимально автоматизирован. В результате пользователь выполняет лишь необходимый минимум действий, а все остальное
7. Предложение коучинга в мини-группе или один на один
7. Предложение коучинга в мини-группе или один на один Если человек оплатил товар и даже купил у вас что-то еще, это не повод останавливаться. Вы можете позвонить всем клиентам по телефону и предложить бесплатную 15-минутную личную консультацию и продать коучинг один на
1. UNION ALL
1. UNION ALL Очевидное решение, не требующее комментариев. Заметим лишь, что UNION не подходит для решения этой задачи, т.к. устраняет дубликаты.SELECT col1 col FROM TUNION ALLSELECT col2 FROM
Как объединить несколько книг
Как объединить несколько книг 1. Откройте два окна Fiction Book Designer (скажем, окно 1 и окно 2).2. Загрузите книгу в окно 1, выберите весь ее текст (Ctrl+A) и скопируйте его в клипборд (Ctrl+Ins или Ctrl+C).3. В окне 2 кликните на то место, куда Вы хотите поместить текст книги и нажмите Shift+Ins или Ctrl+V.4.
Запросы UNION
Запросы UNION Запросы объединения дают возможность выбрать строки соответствующих форматов из различных наборов данных в объединенный набор данных, который приложения могут использовать так, как если бы он был одной таблицей только для чтения. Подмножества, найденные в
Оператор UNION
Оператор UNION Оператор UNION может быть использован для объединения результатов двух или более операторов SELECT и создания единого набора только для чтения, состоящего из строк, полученных из разных таблиц или из разных наборов, запрошенных из той же таблицы. Множество
UNION ALL
UNION ALL Если в процессе создания объединенного набора были сформированы дублированные строки, то поведение по умолчанию — исключение из набора дублированных строк. Для включения дубликатов используйте UNION ALL вместо
Как объединить несколько книг
Как объединить несколько книг 1. Откройте два окна Fiction Book Designer (скажем, окно 1 и окно 2).2. Загрузите книгу в окно 1, выберите весь ее текст (Ctrl+A) и скопируйте его в клипборд (Ctrl+Ins или Ctrl+C).3. В окне 2 кликните на то место, куда Вы хотите поместить текст книги и нажмите Shift+Ins или Ctrl+V.4.
Как объединить несколько книг
Как объединить несколько книг 1. Откройте два окна Fiction Book Designer два раза (скажем, окно 1 и окно 2).2. Загрузите книгу в окно 1, выберите весь ее текст (Ctrl+A) и скопируйте его в буфер обмена (Ctrl+Ins или Ctrl+C).3. В окне 2 кликните на то место, куда Вы хотите поместить текст книги и нажмите
Как объединить несколько файлов
Как объединить несколько файлов Нажмите «Tools» -› «Join Books».Эта опция позволяет объединять множественные файлы в одну книгу. В настоящее время объединять можно только два типа файлов: txt и
PS4 стартовала, Xbox One на подходе: один на один или двое против всех? Евгений Золотов
PS4 стартовала, Xbox One на подходе: один на один или двое против всех? Евгений Золотов Опубликовано 18 ноября 2013 Затянувшееся перемирие в войне игровых консолей окончено: в пятницу в США стартовали продажи Sony PlayStation 4, а её основной соперник, Xbox One от
Щепетнёв: Как один блоггер двух главврачей посрамил Василий Щепетнев
Щепетнёв: Как один блоггер двух главврачей посрамил Василий Щепетнев ОпубликованоВасилий Щепетнев Странная история произошла в славном городе Воронеже. То есть история-то самая обыкновенная, странной ее сделали информационные технологии,