+= (присваивание объединения строк) (Transact-SQL)
Объединяет две строки и присваивает строке результат этой операции. Например, если переменная @x имеет значение ‘Adventure’, то операция @x += ‘Works’ принимает исходное значение @x, добавляет к нему строку ‘Works’ и присваивает переменной @x новое значение (‘AdventureWorks’).
Синтаксис
expression += expression
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
выражение
Любое допустимое выражение любого символьного типа данных.
Типы результата
Возвращает тип данных, определенный для переменной.
Замечания
SET @v1 += ‘expression’ эквивалентно SET @v1 = @v1 + ‘expression’. Кроме того, SET @v1 = @v2 + @v3 + @v4 — это эквивалент SET @v1 = (@v2 + @v3) + @v4.
Оператор += нельзя использовать без переменной. Например, следующий код вызывает ошибку:
SELECT 'Adventure' += 'Works'
Примеры
А. Объединение с использованием оператора +=
В следующем примере выполняется объединение строк с помощью оператора += .
DECLARE @v1 VARCHAR(40); SET @v1 = 'This is the original.'; SET @v1 += ' More text.'; PRINT @v1;
This is the original. More text.
B. Порядок вычисления во время объединения с помощью оператора +=
В приведенном ниже примере выполняется объединение нескольких строк в одну длинную строку, а затем предпринимается попытка вычислить длину итоговой строки. В этом примере демонстрируются правила оценки и усечения при использовании оператора объединения.
DECLARE @x VARCHAR(4000) = REPLICATE('x', 4000) DECLARE @z VARCHAR(8000) = REPLICATE('z',8000) DECLARE @y VARCHAR(max); SET @y = ''; SET @y += @x + @z; SELECT LEN(@y) AS Y; -- 8000 SET @y = ''; SET @y = @y + @x + @z; SELECT LEN(@y) AS Y; -- 12000 SET @y = ''; SET @y = @y +(@x + @z); SELECT LEN(@y) AS Y; -- 8000 -- or SET @y = ''; SET @y = @x + @z + @y; SELECT LEN(@y) AS Y; -- 8000 GO
Y ------- 8000 (1 row(s) affected) Y ------- 12000 (1 row(s) affected) Y ------- 8000 (1 row(s) affected) Y ------- 8000 (1 row(s) affected)
+ (объединение строк) (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 значения.
Объединение строк в одну в 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 не набрасываются на новичков, как стервятники, как это бывает на некоторых форумах, где сидят зазнавшиеся бакланы. На мой взгляд это очень важно.
Только что жаловался на то, что не могу купить из России игру с доставкой в Россию. Уже выслали ссылку на магазин, где можно купить просто ключик. Проблема ключика только в том, что игра останавливается, при потери связи с интернетом. По крайней мере так написано в описании ключа. Но это же западло. А как играть по дороге на работу и домой в метро?
Я понимаю, что при отсутствии диска игре приходится нюхать интернет для авторизации, но не в процессе же всей игры. Это сколько трафика она высасывает. Нет, мне все же нужно иметь возможно играть в метро, поэтому я не жалею, что заказал лицензионный диск. Его можно без проблем забрать у жены утром и играть в метро по дороге на работу и домой. А она пусть ждет меня у окошка, и думает обо мне любимом.
А вообще я не очень люблю коды. Я предпочитаю покупать физические диски, когда есть возможность. В принципе, многое сейчас продается в виртуальном, а не коробочном варианте, но при этом выборе я все же всегда отдаю предпочтение коробке. Не знаю почему, но люблю физически ощущать, что я купил. Пусть эта коробка стоит на полке без толку уже не первый год.
