Intereting Posts
Подведение итогов исторических данных Uptime Получение IIS для олицетворения пользователя Windows на сервере SQL в среде интрасети Использование «varchar» в качестве первичного ключа? плохая идея? или нормально? Сглаживание данных xml в sql Сервер MSSQL вводит скрытые спам-ссылки, любое окончательное решение? SQL Server – использование условий использования Разделение запроса обновления повышает производительность SQL Server T-SQL TRIM END Невозможно найти ни столбца «dbo», ни определяемую пользователем функцию, ни агрегат «dbo.Splitfn», либо имя неоднозначно Использование функции table-value внутри представления в SQL Server в плане запроса отображается ключевой поиск с 99%, когда значение условия поиска равно нулю SQL Server UPPERCASE для всех данных для всех столбцов в таблице Microsoft Master Data Services: как получить / установить описание модели / объекта программным путем Подавить вывод SELECT на основе предложения WHERE SQL Server: выбор части «WEEKDAY» путем передачи даты в формате «ddd»

SQL: объединить значения столбцов в одну строку в строку, разделенную запятой

Предположим, у меня есть такая таблица в SQL Server:

Id City Province Country 1 Vancouver British Columbia Canada 2 New York null null 3 null Adama null 4 null null France 5 Winnepeg Manitoba null 6 null Quebec Canada 7 Seattle null USA 

Как я могу получить результат запроса, чтобы местоположение было конкатенацией города, провинции и страны, разделенных символом «,», с опущенными значениями. Я хотел бы убедиться, что нет никаких конечных запятых, предшествующих запятым или пустых строк. Например:

 Id Location 1 Vancouver, British Columbia, Canada 2 New York 3 Adama 4 France 5 Winnepeg, Manitoba 6 Quebec, Canada 7 Seattle, USA 

Solutions Collecting From Web of "SQL: объединить значения столбцов в одну строку в строку, разделенную запятой"

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

 DECLARE @x TABLE(Id INT, City VARCHAR(32), Province VARCHAR(32), Country VARCHAR(32)); INSERT @x(Id, City, Province, Country) VALUES (1,'Vancouver','British Columbia','Canada'), (2,'New York' , null , null ), (3, null ,'Adama' , null ), (4, null , null ,'France'), (5,'Winnepeg' ,'Manitoba' , null ), (6, null ,'Quebec' ,'Canada'), (7,'Seattle' , null ,'USA' ); SELECT Id, Location = STUFF( COALESCE(', ' + RTRIM(City), '') + COALESCE(', ' + RTRIM(Province), '') + COALESCE(', ' + RTRIM(Country), '') , 1, 2, '') FROM @x; 

SQL Server 2012 добавил новую функцию T-SQL под названием CONCAT , но здесь это не полезно, так как вам по-прежнему необязательно включать запятые между обнаруженными значениями, и нет возможности для этого – он просто путает значения вместе без опции для разделитель. Это позволяет избежать необходимости беспокоиться о типах, отличных от строки, но не позволяет очень эффективно обрабатывать нули и ненулевые значения.

 select Id , Coalesce( City + ',' +Province + ',' + Country, City+ ',' + Province, Province + ',' + Country, City+ ',' + Country, City, Province, Country ) as location from table 

Это сложная проблема, потому что запятые должны проходить между ними:

 select id, coalesce(city+', ', '')+coalesce(province+', ', '')+coalesce(country, '') from t 

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

 select id, (case when right(val, 2) = ', ' then left(val, len(val) - 1) else val end) as val from (select id, coalesce(city+', ', '')+coalesce(province+', ', '')+coalesce(country, '') as val from t ) t 

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

Используйте оператор «+».

Поймите, что нулевые значения не работают с оператором «+» (например, «Winnepeg» + null = null), поэтому не забудьте использовать функции ISNULL () или COALESCE () для замены нулей пустой строкой, например: ISNULL ('Winnepeg', '') + ISNULL (null, '').

Кроме того, если даже возможно, что одна из ваших столбцов может быть интерпретирована как число, тогда обязательно используйте функцию CAST (), чтобы избежать ошибок, например: CAST («Winnepeg» как varchar ( 100)).

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

Удачи

уродливый, но он будет работать для MS SQL:

  select id, case when right(rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')),1)=',' then left(rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')),LEN(rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')))-1) else rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')) end from table 

Вот вариант:

 SELECT (CASE WHEN City IS NULL THEN '' ELSE City + ', ' END) + (CASE WHEN Province IS NULL THEN '' ELSE Province + ', ' END) + (CASE WHEN Country IS NULL THEN '' ELSE Country END) AS LOCATION FROM MYTABLE