【问题标题】:Split a column into multiple columns in a SQL query using pipe delimiter使用管道分隔符在 SQL 查询中将一列拆分为多列
【发布时间】:2019-07-09 18:43:33
【问题描述】:

我在表格的一列中有以下数据,我想将其拆分为更多列。 在这种情况下,| 用作分隔符。列标题应该在 : & 之后的列是它的值。

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

【问题讨论】:

标签: sql string split


【解决方案1】:

您有几行在 nvarchar 列中包含键值对,但您需要一个表,该表具有基于键的标题,然后是仅包含值的行,无键。首先是像 Key1: Value1 | 这样的输入问题。 Key2:价值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),但我不推荐它。

【讨论】:

    【解决方案2】:

    这是一个部分答案,您可以使用它以分隔字符串返回第 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      相关资源
      最近更新 更多