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

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

  • автор:

+ (объединение строк) (Transact-SQL)

Оператор в строковом выражении, объединяющий две или более символьных или двоичных строки, два или более столбцов или несколько строк и имен столбцов в одно выражение (строковый оператор). Например, SELECT ‘book’+’case’; возвращает bookcase .

Синтаксис

expression + expression 

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

выражение
Любое действительное выражение любого типа данных в категории символьных и двоичных данных, за исключением типов данных image, ntext и text. Оба выражения должны иметь одинаковый тип данных, или одно из выражений должно допускать неявное преобразование к типу данных другого выражения.

При сцеплении двоичных строк с любыми символами между двоичными строками необходимо использовать явное преобразование в символьные данные. В следующем примере показано, когда CONVERT или CAST должны использоваться с двоичной конкатенацией и когда CONVERT или CAST не нужно использовать.

DECLARE @mybin1 VARBINARY(5), @mybin2 VARBINARY(5) SET @mybin1 = 0xFF SET @mybin2 = 0xA5 -- No CONVERT or CAST function is required because this example -- concatenates two binary strings. SELECT @mybin1 + @mybin2 -- A CONVERT or CAST function is required because this example -- concatenates two binary strings plus a space. SELECT CONVERT(VARCHAR(5), @mybin1) + ' ' + CONVERT(VARCHAR(5), @mybin2) -- Here is the same conversion using CAST. SELECT CAST(@mybin1 AS VARCHAR(5)) + ' ' + CAST(@mybin2 AS VARCHAR(5)) 

Типы результата

Возвращает тип данных аргумента с самым высоким приоритетом. Дополнительные сведения см. в разделе Приоритет типов данных (Transact-SQL).

Замечания

При работе с пустыми строками нулевой длины оператор + (объединение строк) ведет себя иначе, чем при работе со значениями NULL или с неизвестными значениями. Символьная строка символа нулевой длины может быть указана в виде двух одинарных кавычек без каких-либо символов между ними. Двоичная строка нулевой длины может быть указана как 0x без указания каких-либо байтовых значений в шестнадцатеричной константе. При сцеплении строки нулевой длины всегда сцепляются две указанные строки. При работе со строками со значением NULL результат объединения зависит от настроек сеанса. При присоединении нулевого значения к известному значению результатом будет неизвестное значение, объединение строк с нулевым значением также дает нулевое значение, как и в арифметических действиях с нулевыми значениями. Однако можно изменить данное поведение, поменяв значение CONCAT_NULL_YIELDS_NULL для текущего сеанса. Дополнительные сведения см. в статье SET CONCAT_NULL_YIELDS_NULL (Transact-SQL).

Если результат объединения строк превышает предел в 8 000 байт, то он усекается. Однако усечения не произойдет, если хотя бы одна из сцепляемых строк принадлежит к типу больших значений.

Примеры

А. Использование объединения строк

В следующем примере создается единственный столбец с заголовком Name из нескольких символьных столбцов, где за фамилией лица следуют запятая, один пробел и имя того же лица. Результирующий набор сортируется в алфавитном порядке по возрастанию, сначала по фамилии, а затем по имени.

-- Uses AdventureWorks SELECT (LastName + ', ' + FirstName) AS Name FROM Person.Person ORDER BY LastName ASC, FirstName ASC; 

B. Объединение числовых типов данных и дат

В приведенном ниже примере функция CONVERT используется для объединения типов данных numeric и date.

-- Uses AdventureWorks SELECT 'The order is due on ' + CONVERT(VARCHAR(12), DueDate, 101) FROM Sales.SalesOrderHeader WHERE SalesOrderID = 50001; GO 
------------------------------------------------ The order is due on 04/23/2007 (1 row(s) affected) 

C. Использование объединения нескольких строк

В следующем примере объединяются несколько строк для формирования одной длинной строки для отображения фамилии и первого инициала вице-президентов в Adventure Works Cycles. После фамилии ставится запятая, а после первой буквы инициалов — точка.

-- Uses AdventureWorks SELECT (LastName + ',' + SPACE(1) + SUBSTRING(FirstName, 1, 1) + '.') AS Name, e.JobTitle FROM Person.Person AS p JOIN HumanResources.Employee AS e ON p.BusinessEntityID = e.BusinessEntityID WHERE e.JobTitle LIKE 'Vice%' ORDER BY LastName ASC; GO 
Name Title ------------- ---------------` Duffy, T. Vice President of Engineering Hamilton, J. Vice President of Production Welcker, B. Vice President of Sales (3 row(s) affected) 

D. Использование больших строк при объединении

В приведенном ниже примере выполняется объединение нескольких строк в одну длинную строку, а затем предпринимается попытка вычислить длину итоговой строки. Итоговая длина результирующего набора равна 16 000, так как вычисление выражения начинается слева: @x + @z + @y => (@x + @z) + @y. В этом случае результат (@x + @z) усекается до 8000 байтов, а затем в результирующий набор добавляется значение @y, после чего длина итоговой строки становится равна 16 000. Так как @y — это строка типа с большим значением, усечения не происходит.

DECLARE @x VARCHAR(8000) = REPLICATE('x', 8000) DECLARE @y VARCHAR(max) = REPLICATE('y', 8000) DECLARE @z VARCHAR(8000) = REPLICATE('z',8000) SET @y = @x + @z + @y -- The result of following select is 16000 SELECT LEN(@y) AS y GO 
y ------- 16000 (1 row(s) affected) 

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

Д. Использование объединения нескольких строк

В приведенном ниже примере несколько строк сцепляются в одну длинную строку для отображения фамилий и инициалов имен вице-президентов из образца базы данных. После фамилии ставится запятая, а после первой буквы инициалов — точка.

-- Uses AdventureWorks SELECT (LastName + ', ' + SUBSTRING(FirstName, 1, 1) + '.') AS Name, Title FROM DimEmployee WHERE Title LIKE '%Vice Pres%' ORDER BY LastName ASC; 
Name Title ------------- --------------- Duffy, T. Vice President of Engineering Hamilton, J. Vice President of Production Welcker, B. Vice President of Sales 

CONCAT — конкатенация строк

Конкатенация строк — это объединение нескольких строк в одну. Мы рассматривали возможности SQL для конкатенации строк здесь.

Сейчас рассмотрим, как ведут себя NULL значения при объединении строк.

SELECT 'Раз, ' || 'два, ' || NULL AS result 
# result
1 NULL

Если хотя бы одна из строк при конкатенации через || будет равна NULL , то результат конкатенации будет NULL .

Для тех, кто переходит с ORACLE на PostgreSQL, это может быть неожиданностью. В ORACLE значения NULL при конкатенации обрабатываются как пустая строка » и не превращают результат в NULL .

Воспользуемся функцией concat :

SELECT concat('Раз, ', 'два, ', NULL) AS result 
# result
1 Раз, два,

Функция concat игнорирует NULL значения.

MySQL / MariaDB Объединить строки в одну строку — Функции CONCAT() и CONCAT_WS()

MySQL / MariaDB Объединить строки в одну строку - Функции CONCAT() и CONCAT_WS()

В сегодняшней статье мы рассмотрим как можно в базе данных MySQL и MariaDB объединять строки в одну строку. Казалось бы, это достаточно простая задача, но не все так просто. Объединение полей строк в отдельное поле в наборе результатов возможно с помощью нескольких функций управления строками. За объединение строк в базе данных MySQL и MariaDB отвечают две функции CONCAT() и CONCAT_WS().

Смотреть как работают функции мы будем на таблице fio которую я создал и добавил в неё несколько строк.

mysql_mariadb_concat_concat_ws

mysql_mariadb_concat_concat_ws

Функция CONCAT().

SELECT CONCAT(string_1,string_2. ) FROM table_name WHERE field_name = value

Функция может принимать один и более строк для объединения.

В первом варианте мы попробуем объединить два поля, имя и фамилию пользователя.

sql> SELECT CONCAT(first_name, ‘ ‘ ,last_name) AS fio FROM fio WHERE ;

mysql_mariadb_concat_concat_ws

Как видим в результате у нас объединились два поля, но между ними нет разделителя.

Для того чтобы добавить разделитель, можно добавить еще одну строку, но она будет в качестве пробела.

sql> SELECT CONCAT(first_name, ‘ ‘ ,last_name) AS fio FROM fio WHERE ;

mysql_mariadb_concat_concat_ws

При объединении строк с помощью функции CONCAT() нужно учитывать одну очень важную деталь, если в одном из полей окажется NULL, то функция вернут NULL.

sql> SELECT CONCAT(first_name, middle_name) AS fio FROM fio WHERE ;

mysql_mariadb_concat_concat_ws

Функция CONCAT_WS().

SELECT CONCAT_WS(separator, string_1,string_2. ) FROM table_name WHERE field_name = value

Функция CONCAT_WS отличается от функции CONCAT тем что CONCAT_WS принимает первым параметром разделитель строк, а уже потом поля строк которые мы хотим объединить.

Мы будем использовать те же примеры, что выше я показывал, но только теперь вместо функции CONCAT мы будем использовать функцию CONCAT_WS с разделителем.

В первом варианте мы попробуем объединить два поля, имя и фамилию пользователя.

sql> SELECT CONCAT_WS(‘-‘,first_name, last_name) FROM fio WHERE >

mysql_mariadb_concat_concat_ws

Как мы помним из примера выше что если передать в функцию CONCAT значения NULL то и сама функция вернут NULL. С функцией CONCAT_WS все немного по другому, если в одном из полей окажется значения NULL то функция вернут значения того поля которые не является NULL.

sql> SELECT CONCAT_WS(‘-‘,first_name, middle_name) FROM fio WHERE >

mysql_mariadb_concat_concat_ws

Всем спасибо, я надеюсь что вам моя статья хоть чем-то помогла.

Объединение строк в одну в SQL

13 Июня 2011 Программирование
8 0

В SQL Server почему-то народ часто сталкивается с проблемой объединения значений нескольких строк в одну. Например, допустим, что есть запрос:

SELECT ColumnName FROM TableName

Допустим, что запрос возвращает три строки:

Иванов Петров Сидоров

А теперь допустим, что ты хочешь вывести результат не в виде трех строк, а в виде одной строки. И еще хуже, в виде одной колонки, да еще и связать с результатом другого запроса. Самый простейший вариант — написать хранимую процедуру, которая будет читать данные с помощью курсора, объединять их в одну переменную и возвращать результат в виде varchar значения. Простое решение, но не единственное. Иногда просто нельзя писать процедуру.

Если не хочешь писать процедур, SQL Serer позволяет обойтись простым запросом SELECT, просто нужно схитрить с помощью конструкции FOR XML PATH:

SELECT ColumnName + ' ' AS [text()] FROM TableName FOR XML PATH ('')

Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым

А еще поделитесь с друзьями

Комментарии

ronin

14 Июня 2011

в Mysql пользуюсь group_concat, очень удобная и довольно таки шустрая функция

Владимир (Гаврилов)

14 Июня 2011

Во как! Странно почему не предусмотрели какой-нибудь GROUP_CONCAT()

Алексей

14 Июня 2011

Михаил. немного не в тему,но вот на днях "вскрыли" БД сената США. я сразу вспомнил раздел в Web-сервер глазами хакера. Вы удивлены действиями lulzsec? ))

И вообще как вы прокомментируете их деятельность?

Михаил Фленов

14 Июня 2011

Это их право и их выбор. Я не поддерживаю подобных действий.

Войтов Евгений

16 Октября 2011

А я правильно понял что в бд хранятся не структурированные данные? А чего же так?

Михаил Фленов

16 Октября 2011

почему не структурированные?

mh-coder

07 Октября 2013

Чёза бред, вы хоть сами пробовали свой запрос прежде чем предлогать?
а нечё что в ответе мы получим You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘AS [text()]

Михаил Фленов

07 Октября 2013

а "нечё" что в заметке говориться про SQL Server, а не MySQL?

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

Давно я не обновлял свои компоненты, потому что не было времени, но обновления есть, они не могут не есть. Сейчас я занялся обновлением всех своих компонентов. Сегодня на свет выходит Gantt Chart Control .NET. В нем пока изменений, не много, но очень интересные: теперь ты можешь не только перетаскивать работы по рабочей форме, но и изменять размер с помощью мышки. Ну а так же появилась возможность включить подсказки, и при наведении на работу будет появляться подсказска с заголовком и описанием работы.

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

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

И это еще не считая трех мусорников, которые я использую каждый раз, когда просят ящик на какое-то спамерские нужды. Но их я даже не всегда чищу. два чищу раз в неделю, а тот, что на яшке вообще не проверяю.

А сколько у тебя почтовых ящиков?

Меня как-то спрашивали, почему-бы не сделать на сайте регистрацию и не развить сайт до чего-то более крупного, что будет включать форум и другие сервисы. Зачем делать что-то очередное, когда уже полно подобных решений. Например, на мой взгляд лучший форум программистов — это www.programmersforum.ru.

Я не собираюсь конкурировать с существующими решениями, тем более что мне самому нравится этот форум. Я даже на нем когда-то был зарегистрирован. А почему когда-то, я до сих пор там зарегистрирован. Просто времени нету сейчас заходить и болтать с народом. Но когда работал в России, то у меня было достаточно времени в рабочее время иногда общаться с народом. Ну а на programmersforum.ru всегда было приятно поболтать с народом. На удивление там собралось много отличных программистов, которые помогают друг-другу, а именно это основная задача форума.

Самое главное, что программисты на programmersforum.ru не набрасываются на новичков, как стервятники, как это бывает на некоторых форумах, где сидят зазнавшиеся бакланы. На мой взгляд это очень важно.

Только что жаловался на то, что не могу купить из России игру с доставкой в Россию. Уже выслали ссылку на магазин, где можно купить просто ключик. Проблема ключика только в том, что игра останавливается, при потери связи с интернетом. По крайней мере так написано в описании ключа. Но это же западло. А как играть по дороге на работу и домой в метро?

Я понимаю, что при отсутствии диска игре приходится нюхать интернет для авторизации, но не в процессе же всей игры. Это сколько трафика она высасывает. Нет, мне все же нужно иметь возможно играть в метро, поэтому я не жалею, что заказал лицензионный диск. Его можно без проблем забрать у жены утром и играть в метро по дороге на работу и домой. А она пусть ждет меня у окошка, и думает обо мне любимом.

А вообще я не очень люблю коды. Я предпочитаю покупать физические диски, когда есть возможность. В принципе, многое сейчас продается в виртуальном, а не коробочном варианте, но при этом выборе я все же всегда отдаю предпочтение коробке. Не знаю почему, но люблю физически ощущать, что я купил. Пусть эта коробка стоит на полке без толку уже не первый год.

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

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