如何将字符串分成不同的列?

use*_*978 5 sql sql-server sql-server-2008

我有一张像这样的条目的表.

    MachineName
-----------------------

    Ab bb zecos
    a zeng
    zeng
    empty
Run Code Online (Sandbox Code Playgroud)

表中有4行.

我如何分离这4行以获得输出.

       M1       M2       M3
-----------------------------------
       Ab       bb      zecos
       a        zeng     NULL
       zeng     NULL     NULL
       NULL     NULL     NULL
Run Code Online (Sandbox Code Playgroud)

pra*_*een 9

不是使用split函数,而是有一个名为ParseName的函数,它返回对象的指定部分,该部分用于渲染由其设定的字符串. 请通过ParseName链接帮助我编写此查询

Declare @Sample Table
(MachineName varchar(max))

Insert into @Sample
values 
('Ab bb zecos'),('a Zeng')


  SELECT 
  Reverse(ParseName(Replace(Reverse(MachineName), ' ', '.'), 1)) As [M1]
 , Reverse(ParseName(Replace(Reverse(MachineName), ' ', '.'), 2)) As [M2]
 , Reverse(ParseName(Replace(Reverse(MachineName), ' ', '.'), 3)) As [M3]

  FROM  (Select MachineName from @Sample
  ) As [x] 
Run Code Online (Sandbox Code Playgroud)

  • 我记得 PARSENAME 不允许超过 4 个项目(因为它用于对象名称,而 4 个部分是对象标识符的最大长度) - 所以只要您记住这一点,您就可以使用它:) (2认同)

Cha*_*leh 6

试试这个:

    CREATE FUNCTION [dbo].[SplitIndex](@Delimiter varchar(20) = ' ', @Search varchar(max), @index int)
    RETURNS varchar(max)
    AS
    BEGIN
          DECLARE @ix int,
                      @pos int,
                    @rt varchar(max)

          DECLARE @tb TABLE (Val varchar(max), id int identity(1,1))

          SET @ix = 1
          SET @pos = 1


          WHILE @ix <= LEN(@search) + 1 BEGIN

                SET @ix = CHARINDEX(@Delimiter, @Search, @ix)

                IF @ix = 0
                      SET @ix = LEN(@Search)
                ELSE
                      SET @ix = @ix - 1

                INSERT INTO @tb
                SELECT SUBSTRING(@Search, @pos, @ix - @pos + 1)

                SET @ix = @ix + 2
                SET @pos = @ix
          END

          SELECT @Rt = Val FROM @Tb WHERE id = @index
          RETURN @Rt     
    END
Run Code Online (Sandbox Code Playgroud)

像这样使用:

SELECT dbo.SplitIndex(' ', 'hello World', 1)
Run Code Online (Sandbox Code Playgroud)

将其与民主党的答案结合起来,你应该可以走了

(注意如果指定的索引不存在则返回NULL)

例如

SELECT dbo.SplitIndex(' ', 'Hello World', 3)  
Run Code Online (Sandbox Code Playgroud)

将返回 NULL,因为索引 3 不存在

但不确定性能如何,我刚刚修改了我所做的表值分割函数,因此可能值得重写为更像 MySql 版本