Как получить «,» вместо «и» в строках в SQL Server - PullRequest
0 голосов
/ 10 мая 2018

У меня есть таблица Test с 1 столбцом

Module_name

Table  
Computer  
Laptop  
Chair  

Мой ожидаемый результат:

Table,Computer,Laptop and Chair

Мой запрос:

declare @module_name varchar(50)
SELECT @Module_Name = COALESCE(@Module_Name + ' and ', '') + module_name FROM
    (SELECT DISTINCT module_name FROM Test) T       
    select @module_name

Я получаю вывод как:

Table and Computer and Laptop and Chair

Меня интересует, как получить "," вместо "и".

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Используется Row_number для захвата последней строки,

CREATE TABLE test
    ([Module_name] varchar(8))
;

INSERT INTO test
    ([Module_name])
VALUES
    ('Table'),
    ('Computer'),
    ('Laptop'),
    ('Chair')
;

 SELECT STUFF((SELECT CASE WHEN RN = MAX(RN) OVER () THEN ' and ' ELSE ', ' END + Module_name
    from 
    (

        SELECT Module_name,
               ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN 
        FROM test
    ) rns

    ORDER BY RN
    FOR XML PATH('')),1,2,'');
0 голосов
/ 10 мая 2018

Я не поддерживаю это решение, как я сказал в комментариях, "грамматизация" должна быть сделана на вашем уровне представления. .Однако вы можете добиться этого в SQL следующим образом:

Редактировать: Небольшое обновление для обработки возврата одного значения.

CREATE TABLE #Sample (Module varchar(10));

INSERT INTO #Sample
VALUES ('Table'),
       ('Computer'),
       ('Laptop'),
       ('Chair');
GO
WITH RNs AS (
    SELECT Module,
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN --SELECT NULL as there is no ID field to work with here, thus the order will be random
    FROM #Sample)
SELECT STUFF((SELECT CASE WHEN RN = MAX(RN) OVER () AND RN != 1 THEN ' and ' ELSE ', ' END + Module
              FROM RNs
              ORDER BY RN
              FOR XML PATH('')),1,2,'');

GO

DROP TABLE #Sample;
0 голосов
/ 10 мая 2018

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

DECLARE @result VARCHAR(MAX) = STUFF(
    (
        SELECT DISTINCT
            ', ' + T.module_name
        FROM
            Test AS T
        FOR XML
            PATH('')
    ),
    1, 2, '')


SET @result = 
    REVERSE(
        STUFF(                                  -- Replace
            REVERSE(@result),                   -- ... in the reversed string
            CHARINDEX(',', REVERSE(@result)),   -- ... at the first position of the comma (the last one on the original string)
            1,                                  -- just 1 character (the comma)
            'dna ')                             -- for the reversed " and"
        )

SELECT @result
0 голосов
/ 10 мая 2018

Вы пробовали xml метод с stuff() функцией?

declare @Module_names varchar(max)

set @Module_names = stuff((select distinct ',' +Module_name 
                           from table t
                           for xml path('')),1,1, '')  
select REVERSE(STUFF(REVERSE(@Module_names),                
                    CHARINDEX(',', REVERSE(@Module_names)), 1,' dna ')) as Module_names
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...