Разделить столбец на несколько столбцов в запросе SQL с помощью разделителя канала - PullRequest
0 голосов
/ 09 июля 2019

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

Column
-----------------------------------------------------------------------------
ID: 30000300 | Name: India | Use: New Use
ID: 30000400 | Name: Aus | New ID: 15625616 | Address 1: NEW Rd
ID: 30000400 | Name: USA | City: VIA ARAMAC | New ID: 123
ID: 30000500 | Name: Russia | New ID: 15624951 | Address 2: 2131 BEAUDESERT

Вывод должен быть:

ID          Name    Use New ID  City     Address 1   Address 2   New City
----------------------------------------------------------------------
30000300    India   New Use                 
30000400    Aus         15625616        NEW Rd      
30000400    USA         15625616    VIA ARAMAC          GALILEE 
30000500    Russia      15624951            2131 BEAUDESERT

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Вот частичный ответ, который вы можете использовать для возврата n-й записи в строке с разделителями:

DECLARE @DelimitedString VARCHAR(8000);
DECLARE @Delimiter VARCHAR(100);
DECLARE @indexToReturn INT;



DECLARE @tblArray TABLE
(
    ElementID INT IDENTITY(1, 1), -- Array index
    Element VARCHAR(1000)         -- Array element contents
);
-- Local Variable Declarations
-- ---------------------------
DECLARE @Index SMALLINT,
        @Start SMALLINT,
        @DelSize SMALLINT;

SET @DelSize = LEN(@Delimiter + 'x') - 1;



-- Loop through source string and add elements to destination table array
-- ----------------------------------------------------------------------
WHILE LEN(@DelimitedString) > 0
BEGIN

    SET @Index = CHARINDEX(@Delimiter, @DelimitedString);

    IF @Index = 0
    BEGIN

        INSERT INTO @tblArray
        (
            Element
        )
        VALUES
        (LTRIM(RTRIM(@DelimitedString)));

        BREAK;
    END;
    ELSE
    BEGIN

        INSERT INTO @tblArray
        (
            Element
        )
        VALUES
        (LTRIM(RTRIM(SUBSTRING(@DelimitedString, 1, @Index - 1))));

        SET @Start = @Index + @DelSize;
        SET @DelimitedString = SUBSTRING(@DelimitedString, @Start, LEN(@DelimitedString) - @Start + 1);

    END;
END;

DECLARE @val VARCHAR(1000);
SELECT @val = Element
FROM @tblArray AS ta
WHERE ta.ElementID = @indexToReturn;

SELECT @val;
0 голосов
/ 09 июля 2019

У вас есть несколько строк, которые содержат пары ключ-значение внутри столбца nvarchar, но вам нужна таблица с заголовком на основе ключей, а затем строки, содержащие только значения, без ключей.Сначала возникает проблема ввода типа Key1: Value1 |Ключ2: значение2 .Должно ли это быть возвращено как

Key1 Key2
Value1 NULL
NULL Value2

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

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

Если вы настаиваете на том, чтобы делать это через SQL, то решение состоит в том, чтобы превратить исходный ввод строк вдругая строка, которую вы затем sp_executesql (https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql),, но я НЕ рекомендую это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...