Функция, которая принимает значения столбца и конвертирует их в значения, разделенные запятыми - PullRequest
0 голосов
/ 26 марта 2019

Мне нужна функция SQL, которая принимает результат оператора select в качестве параметра и возвращает строку значений, разделенных запятыми, для результата. Если есть значение NULL, то оно должно оставить пробел и продолжить с результатом.

Я пытался использовать выражение COALESCE(), но оно вынимает значения NULL и возвращает только допустимые значения.

declare @str varchar(MAX)

SELECT @str= coalesce(@str + ',', '')+ a.D8_BOOK_YEAR_END 
FROM (select D8_BOOK_YEAR_END from CUST_PRODUCT_ACCOUNTS 
WHERE CUST_PRODUCT_ID=1) a

print @str 

Например: на картинке мне нужно передать столбец NAME в функцию, и он должен вернуть мне значения как Mango, ,Apple,Grape.

Result

Ответы [ 4 ]

0 голосов
/ 26 марта 2019

Вы можете использовать SQL-конкатенацию, используя метод XML PATH () , как показано в следующем примере запроса

SELECT
  STUFF(
    (
    SELECT
      ',' + [user]
    FROM dbo.UserCategoryValues
    FOR XML PATH(''),TYPE
    ).value('.','VARCHAR(MAX)'
    ), 1, 1, ''
  ) As concatenated_string

Это позаботится о значениях NULL. Эти NULL не будут объединены в список

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

0 голосов
/ 26 марта 2019
DECLARE @TABLE TABLE (
    ID INT 
    ,Info VARCHAR(MAX)
    )

INSERT INTO @TABLE
VALUES (1,'mango')

INSERT INTO @TABLE
VALUES (1,'apple')

INSERT INTO @TABLE
VALUES (1,null)

INSERT INTO @TABLE
VALUES (1,'grape')

INSERT INTO @TABLE
VALUES (2,'mango1')

INSERT INTO @TABLE
VALUES (2,null)

INSERT INTO @TABLE
VALUES (2,null)

INSERT INTO @TABLE
VALUES (2,'grape1')


SELECT ID
    ,STUFF((
            SELECT ',' + isnull(info, '')
            FROM @TABLE T1
            WHERE T1.id = T2.ID
            FOR XML PATH('')
            ), 1, 1, '')
FROM @TABLE T2
GROUP BY ID
0 голосов
/ 26 марта 2019

Мне нужна функция SQL , которая принимает результат оператора SELECT в качестве параметра и возвращает строку значений, разделенных запятыми для результата, Если есть нулевое значение, тогда оно должно оставить пробел и продолжить с результатом.

Вы можете сделать это как

--Create a table (just for test)
CREATE TABLE T(
  Str VARCHAR(45)
);

INSERT INTO T VALUES
('One'),
(NULL),
('Two'),
('Three');

-- Create a type
CREATE TYPE MyData AS TABLE (Str NVARCHAR(300));

-- Create the function
CREATE FUNCTION dbo.MyFunc(
  @Data MyData READONLY
)
RETURNS NVARCHAR(300)
AS
BEGIN
  DECLARE @Result NVARCHAR(300) = N'';
  SELECT @Result = STUFF(
                         ( 
                          SELECT ',' + ISNULL(Str, '') --Or ' ' as you like
                          FROM @Data 
                          FOR XML PATH('')
                         ), 1, 1, ''
                        ); 
  RETURN (@Result);
END

-- Finally, use it
DECLARE @Test MyData;

INSERT INTO @Test SELECT * FROM T;

SELECT dbo.MyFunc(@Test);

Возвращает:

+------------------+
| (No column name) |
+------------------+
| One,,Two,Three   |
+------------------+

И here is a live demo

0 голосов
/ 26 марта 2019

Используйте ISNULL(field,' ') где-нибудь, чтобы избежать поведения значения NULL.

...