Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как красиво объединять строки в запросах  [new]
Быдло____кодер
Guest
Часто необходимо в SQL формировать строку в виде объединения полей через разделители, например
Властелин Мира, Пупкин Василий Васильевич, Дата рождения: 11.22.44, Домашний номер: 333-222-33, Семейное положение: замужем

При этом если какой то компонент элемента строки пустой, этот элемент добавлять в результат не надо (т.е если нет даты рождения, не надо писать "Дата рождения"

При конкатенации строки сейчас я пишу так:
  select
         ISNULL(fio + ', ', '') +
         ISNULL('Дата рождения: ' + CONVERT(VARCHAR, BirthDate) + ', ', '')+
         ISNULL('Домашний номер: ' + phone_number)
  from tbl


Но это не удобно:
- все время приходится повторять ISNULL..
- Если последней строки нет, в результате выведется
Властелин Мира, Пупкин Василий Васильевич, Дата рождения: 11.22.44, 
т.е запятая в конце


Хотелось бы иметь функу JOIN('Вася', 'Петя', 'Саша', ', ') которая бы сама джойнила правильно строку с учетом наллов и прочего
Есть ли такое?
29 апр 17, 15:22    [20446030]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
Rankatan
Member

Откуда:
Сообщений: 250
есть CONCAT с sql server 2012
29 апр 17, 15:30    [20446034]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
Быдло___кодер
Guest
1. Там нельзя указать разделитель строк
2. У меня 2008
29 апр 17, 15:36    [20446037]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Быдло___кодер
1. Там нельзя указать разделитель строк
2. У меня 2008

в 2008 других вариантов нет
29 апр 17, 15:41    [20446040]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Rankatan
Быдло___кодер
1. Там нельзя указать разделитель строк
2. У меня 2008

в 2008 других вариантов нет

Если очень хочется, можно запилить CLR библиотеку на C#
29 апр 17, 15:42    [20446041]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
use tempdb;
go

create function dbo.fnStringsConcat
(
 @s1 varchar(max),
 @s2 varchar(max),
 @delimeter varchar(30) = ','
)
returns table
as
return (
 select
  isnull(nullif(@s1, '') + @delimeter, '') + isnull(@s2, '') as ResultString
);
go

select top (100)
 d.ResultString, *
from
 sys.objects so cross apply
 dbo.fnStringsConcat(schema_name(schema_id), name, '.') a cross apply
 dbo.fnStringsConcat(a.ResultString, type_desc, ': ') b cross apply
 dbo.fnStringsConcat(b.ResultString, 'created at:', ', ') c cross apply
 dbo.fnStringsConcat(c.ResultString, cast(create_date as varchar(30)), ' ') d
where
 type <> 'S';
go

drop function dbo.fnStringsConcat;
go
29 апр 17, 16:08    [20446072]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
Быдло____кодер
- Если последней строки нет, в результате выведется
Властелин Мира, Пупкин Василий Васильевич, Дата рождения: 11.22.44, 
т.е запятая в конце
select
STUFF
(
         ISNULL(', '+fio, '') +
         ISNULL(', Дата рождения: ' + CONVERT(VARCHAR, BirthDate), '')+
         ISNULL(', Домашний номер: ' + phone_number,'')
 ,1,2,''
)
from tbl
29 апр 17, 16:56    [20446132]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Rankatan,

CONCAT все NULL вставляет как '', что в данном случае, совсем не вариант.

Быдло____кодер,
смотрите в сторону XML + STUFF, с 2008
DECLARE @tbl TABLE (
  [id] INT IDENTITY(1,1) PRIMARY KEY,
  [title] VARCHAR(128),
  [full_name] VARCHAR(255),
  [birth_date] DATE,
  [phone_home] VARCHAR(10),
  [marital_status] VARCHAR(10)
)
INSERT INTO @tbl 
VALUES 
  ( 'Властелин Мира', 'Пупкин Василий Васильевич', '19441122', '33322233', 'женат' ),
  ( 'Премудрая', 'Пупкина Василиса Ивановна', '19440101', '33322233', 'замужем' ),
  ( 'Бессмертный', 'Кощей Эдуард Харитонович', NULL, NULL, 'холост' )
;
SELECT
  t.[id],
  [description] = STUFF( (
    SELECT
      [*] = ', ' + ISNULL( [name] + ': ', '' ) + [value]
    FROM (
      VALUES
        ( NULL, [title] ),
        ( NULL, [full_name] ),
        ( 'Дата рождения', CONVERT( VARCHAR, [birth_date], 102 ) ),
        ( 'Домашний номер', [phone_home] ),
        ( 'Семейное положение', [marital_status] )
      ) t2 ( [name], [value] )
    FOR XML PATH ( '' )
  ), 1, 2, '' )
FROM 
  @tbl t
3 май 17, 11:33    [20452538]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
Руслан Дамирович,

почему с 2008, а не с 2005?
3 май 17, 11:42    [20452573]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
rnk
Member

Откуда:
Сообщений: 126
Руслан Дамирович,

Если у вас MSSQL2016, то можно использовать JSON:

declare @json nvarchar(4000) = '{}';
set @json = JSON_MODIFY(@json,'$."ФИО"','Пупкин Василий Васильевич');
set @json = JSON_MODIFY(@json,'$."Дата рождения"','11.22.1944');
set @json = JSON_MODIFY(@json,'$."Домашний номер"',NULL);
set @json = JSON_MODIFY(@json,'$."Семейное положение"','замужем');
print @json;

Результат:
{"ФИО":"Пупкин Василий Васильевич","Дата рождения":"11.22.1944","Семейное положение":"замужем"}

"Домашний номер" отсутствует, что и требовалось.
3 май 17, 11:48    [20452589]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
rnk
Руслан Дамирович,
Если у вас MSSQL2016, то можно использовать JSON

Если у вас нету тещи...
3 май 17, 15:42    [20453576]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
iap
Руслан Дамирович,
почему с 2008, а не с 2005?

кмк, в 2005 нет PATH в FOR XML.
Последний раз я работал с 2005... в 2009 году, может память подводит.
А написал, что с 2008 - на нем точно работает :)
3 май 17, 15:45    [20453587]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
Руслан Дамирович
кмк, в 2005 нет PATH в FOR XML
Я думаю, что есть.
3 май 17, 15:47    [20453594]     Ответить | Цитировать Сообщить модератору
 Re: Как красиво объединять строки в запросах  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5620
iap
Руслан Дамирович
кмк, в 2005 нет PATH в FOR XML
Я думаю, что есть.

Я знаю, что есть. На основе достаточно частой практики.
4 май 17, 02:46    [20455105]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить