Как в sql объединить два столбца в один
Перейти к содержимому

Как в sql объединить два столбца в один

  • автор:

Объединить вывод 2 столбцов в 1 столбец

Допустим надо объединить вывод и ‘адрес’ и ‘второй_адрес’ в одну колонку ‘все_адреса’. SELECT адреса1 . адрес as первый_адрес , адреса1 . второй_адрес as второй_адрес вот так: SELECT ( адреса1 . адрес , адреса1 . второй_адрес ) as все_адреса

'первый_адрес' маяковского площадь победы 'второй_адрес' дмитровское шоссе 'все_адреса' маяковского дмитровское шоссе площадь победы 

Как и можно ли это сделать?

Отслеживать

задан 11 июн 2015 в 12:01

6,363 7 7 золотых знаков 49 49 серебряных знаков 102 102 бронзовых знака

через union пробовали?

11 июн 2015 в 12:05

@Saidolim Djuraev Да это то что нужно.

11 июн 2015 в 12:20

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

SELECT (адреса1.адрес) as все_адреса FROM адреса1 UNION SELECT (адреса1.второй_адрес) as все_адреса FROM адреса1 

Отслеживать

ответ дан 11 июн 2015 в 12:17

1,915 6 6 золотых знаков 26 26 серебряных знаков 48 48 бронзовых знаков

Как объединить два столбца в один новый (через CONCAT)?

Добрый день, форумчане!
Как объединить два столбца в один новый (через CONCAT)?
Надо объединить 2 столбца в один. Использовал как CONCAT, так и CONCAT_WS.
Ничего не вышло, данные не слипаются. При всем этом обычный SELECT работает.

1 2 3 4
ALTER TABLE check2_sql ADD COLUMN ABC_XYZ TEXT NOT NULL; UPDATE check2_sql SET ABC_XYZ = CONCAT(ABC, " ", XYZ); SELECT * FROM check2_sql;

Также пробовал добавить SELECT в SET, но ничего не вышло.

UPDATE check2_sql SET ABC_XYZ = (SELECT(CONCAT(ABC, " ", XYZ)) WHERE id_tov_cl.ABC = id_tov_cl.XYZ);

Данные и столбцы выглядят так:
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Объединить два упорядоченных связанных списка в один через функцию merge
Совсем недавно начал изучение списков в С++(как и сам С++), срочно требуется ваша помощь по решению.

Как объединить два массива в один?
Вот к примеру есть два массива: int A=; int B=; Как создать третий массив С.

Как объединить два запроса в один
Есть 2 запроса. Больно геморно их переписывать в один. Хочу объединить их как это сделать. .

Регистрация: 10.07.2022
Сообщений: 2
Коллеги, вопрос решен!
Я просто зашел в DBeaver и . все зупустилось .
Код такой же:

UPDATE check2_sql SET ABC_XYZ = CONCAT(ABC, " ", XYZ);

Если бы я раньше додумался туда зайти.
Почему так — не знаю. Был бы рад услышать объяснение, почему в MySQL код иногда не работает, а в DBeaver всегда все исправно (уже не в первый раз, кстати (только сейчас вспомнил о других моментах)).

357 / 202 / 77
Регистрация: 28.04.2022
Сообщений: 1,046

ЦитатаСообщение от Oleg_Ch Посмотреть сообщение

почему в MySQL код иногда не работает, а в DBeaver всегда все исправно
А вы не работайте в MySQL, работайте в DBeaver, а MySQL удалите, зачем он нужен-то.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как объединить два цикла в один
for i = 2:2:length(m) m(i)= m(i)*2; end for B= 1:2:length(m) m(B)= 0; end Нужно.

Как объединить два тома в один?
Перед тем как переустановить OC , хочу соединить два жесткого диска в один , а потом снова.

Как объединить два макроса в один?
Есть два макроса Sub Макрос2() ‘ ‘ Макрос2 Макрос ‘ ‘ Selection.InsertFormula.

Как объединить эти два кода в один?
Здравствуйте, уважаемые участники и Администратор сайта. Вопрос такой, как мне объеденить код №1 с.

Есть два запроса, как их объединить в один?
есть запрос SELECT TIME FROM reception WHERE TIME NOT IN (SELECT TIME FROM doctor) и запрос .

Как объединить два avi файла в один?
Как объединить два avi файла в один? Подозреваю, что через потоки данных, но мало в этом понимаю.

Как объединить два столбца в один sql

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

08 ноября 2022

Eto pri select, a esli ya hochu eto zapisat’ v stolbec?

Есть что добавить? Зарегистрируетесь

Курсы по программированию на Хекслете

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Интенсивные курсы

Интенсивное обучение для продолжающих

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Java

Веб-разработка и автоматическое тестирование на Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Go

Курсы по веб-разработке на языке Go

HTML

Современная верстка с помощью HTML и CSS

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Git

Система управления версиями Git, регулярные выражения и основы командой строки

Похожие вопросы

26 октября 2021
26 октября 2021
26 октября 2021
26 октября 2021

  • 8 800 100 22 47 бесплатно по РФ
  • +7 495 085 28 38 бесплатно по Москве

Направления

  • Курсы «Backend-разработка»
  • Курсы «Frontend-разработка»
  • Курсы «Создание сайтов»
  • Курсы «Тестирование»
  • Курсы «Аналитика данных»
  • Интенсивные курсы
  • Курсы DevOps
  • Курсы «Веб-разработка»
  • Курсы «Математика для программистов»
  • Все курсы

О Хекслете

  • О нас
  • Карьера в Хекслете
  • Хекслет Колледж
  • Сведения об образовательной организации
  • Лицензия № Л035-01216-73/00668844

ООО «Хекслет Рус» 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 команды.

четверг, 23 февраля 2017 г.

Как объединить данные из двух столбцов в один без использования UNION и JOIN?

Как объединить данные из двух столбцов в один без использования UNION и JOIN?

Такие вопросы с завидной регулярностью появляются на страницах различных форумов. К слову сказать, для меня до сих пор остается загадкой, почему при этом ставится дополнительное условие не использовать UNION и/или JOIN. Могу лишь предположить, что это вопросы, которые задают на собеседовании при приеме на работу.

Лирическое отступление. Догадываюсь, как ответил бы на этот вопрос Джо Селко: налицо ошибка проектирования, состоящая в том, что один атрибут расщеплен на два. Однако оставим в стороне вопросы проектирования и перейдем к решению этой задачи.

Создадим тестовую таблицу и добавим в нее немного данных:

 CREATE TABLE T ( col1 INT , col2 INT ) GO INSERT INTO T SELECT 1, 1 UNION ALL SELECT 1, 3 UNION ALL SELECT NULL, NULL UNION ALL SELECT NULL, 2 GO 

Итак, имеется таблица T, которая содержит два столбца с данными одного типа:

 SELECT col1, col2 FROM T 
col1 col2 1 1 1 3 NULL NULL NULL 2

Требуется получить следующий результат:

col  1 1 NULL NULL 1 3 NULL 2

Мне известны три способа, реализуемых стандартными средствами интерактивного языка SQL.

1. UNION ALL

Очевидное решение, не требующее комментариев. Заметим лишь, что UNION не подходит для решения этой задачи, т.к. устраняет дубликаты.

 SELECT col1 col FROM T UNION ALL SELECT col2 FROM T 

2. FULL JOIN

Чтобы не потерять дубликаты, находящиеся в разных столбцах, выполним полное соединение (FULL JOIN) по заведомо ложному предикату, скажем, 1 = 2:

 SELECT T.col1,T1.col2 FROM T FULL JOIN T AS T1 ON 1=2 
col1 col2 1 NULL 1 NULL NULL NULL NULL NULL NULL 1 NULL 3 NULL NULL NULL 2

Далее используем функцию COALESCE, которая даст нам все, что нужно:

 SELECT COALESCE(T.col1,T1.col2) col FROM T FULL JOIN T AS T1 ON 1=2 

3. UNPIVOT

Конструкции PIVOT и UNPIVOT появились в последних версиях стандарта SQL и были реализованы SQL Server, начиная с версии 2005. Первая из них позволяет значения в столбце вытянуть в строку, а вторая поможет нам выполнить обратную операцию:

 SELECT col FROM (SELECT col1, col2 FROM T) p UNPIVOT (col FOR xxx IN (col1, col2) )AS unpvt 

Значения из столбцов col1 и col2 собираются в одном столбце col вспомогательной таблицы unpvt. Однако есть одна особенность в использовании операторов PIVOT и UNPIVOT — они не учитывают NULL-значения. Результат последнего запроса будет таким:

col 1 1 1 3 2

Это препятствие на пути к решению нашей задачи можно преодолеть, если заменить NULL-значение на входе оператора UNPIVOT псевдозначением, т.е. значением, которого заведомо не может быть в исходных данных, а потом выполнить обратное преобразование:

 SELECT NULLIF(col,777) FROM (SELECT COALESCE(col1,777) col1, COALESCE(col2,777) col2 FROM T) p UNPIVOT (col FOR xxx IN (col1, col2) )AS unpvt 

Здесь COALESCE(colx,777) заменяет NULL-значения в столбце colx на 777, а функция NULLIF(col,777) выполняет обратное преобразование.

Последнее решение дает нам требуемый результат, однако содержит один изъян — значение 777 может рано или поздно появиться в данных, что будет приводить к неверным результатам. Чтобы устранить этот огрех, можно использовать значение другого типа, которого заведомо не может присутствовать в целочисленном столбце, например, символ ‘x’. Естественно, чтобы применить этот подход, для совместимости типов целочисленный тип столбцов следует конвертировать к символьному типу, выполнив при необходимости обратное преобразование конечного результата:

 SELECT CAST(NULLIF(col,'x') AS INT) FROM (SELECT COALESCE(CAST(col1 AS VARCHAR),'x') col1, COALESCE(CAST(col2 AS VARCHAR),'x') col2 FROM T) p UNPIVOT (col FOR xxx IN (col1, col2) )AS unpvt 

Несколько слов об эффективности представленных решений. Согласно плану выполнения запроса, основные затраты обусловлены чтением данных (операция сканирования таблицы — Table scan). Для двух первых решений сканирование выполняется дважды, в то время как для последнего (UNPIVOT) — один раз, чем и обусловлено его двойное преимущество в производительности.

 DROP TABLE T 

Комментарии

Н.Петров (aka sql chuvak) 28-08-2008
Есть еще один вариант, который я использую:

 SELECT CASE a WHEN 1 THEN col1 ELSE col2 END col FROM T, (SELECT 1 a UNION ALL SELECT 2) B 

Декартово произведение таблицы T с выборкой из 2-х строк дает «удвоение» (каждая строка таблицы повторяется 2 раза — для а=1 и а=2). Для первого случая берем значение из col1, а для второго — из col2.

Тут, конечно, есть и union, и join, но, по-моему, в данном вопросе интересует именно единственное сканирование таблицы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *