6

我有一张表,里面有这样的条目。

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

    Ab bb zecos
    a zeng
    zeng
    empty

表中的 4 行。

我如何将这 4 行分开以获得类似的输出。

       M1       M2       M3
-----------------------------------
       Ab       bb      zecos
       a        zeng     NULL
       zeng     NULL     NULL
       NULL     NULL     NULL
4

5 回答 5

10

除了使用 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] 
于 2012-06-25T08:52:30.193 回答
4

使用 Parsename() 函数

with cte as(
    select 'Aria Karimi' as FullName
    Union
    select 'Joe Karimi' as FullName
    Union
    select 'Bab Karimi' as FullName
)

SELECT PARSENAME(REPLACE(FullName,' ','.'),2) as Name, PARSENAME(REPLACE(FullName,' ','.'),1) as Family from cte

结果

Name    Family
-----   ------
Aria    Karimi
Bab     Karimi
Joe     Karimi
于 2015-03-18T04:15:27.547 回答
2

试试这个:

    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

像这样使用:

SELECT dbo.SplitIndex(' ', 'hello World', 1)

将它与 Dems 的答案结合起来,你应该很高兴

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

例如

SELECT dbo.SplitIndex(' ', 'Hello World', 3)  

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

虽然不确定性能如何,我只是修改了一个我已经完成的表值拆分函数,因此可能值得重写为更像 MySql 版本

于 2012-06-25T08:49:32.627 回答
2
DECLARE @Tmp TABLE (empid INT,joined nchar(10))

INSERT @Tmp SELECT 1,'1990, 1111' 
INSERT @Tmp SELECT 2,'2000, 2222' 

INSERT @Tmp SELECT 3,'1993, 3333' 

INSERT @Tmp SELECT 4,'1899, 4444' 
INSERT @Tmp SELECT 5,'1999, 5555' 

INSERT @Tmp SELECT 6,'2001, 6666 ' 


--Using PARSENAME 

SELECT empid, joined,
       PARSENAME(REPLACE(joined,',','.'),2) join1, 
       PARSENAME(REPLACE(joined,',','.'),1) join2 
FROM @Tmp
于 2017-02-15T11:16:15.217 回答
-6

如果您使用 C++ 编程,请执行以下操作:

#include <cstring>
#include <iomanip>

using namespace std;
int main () {
string machine[12];
for (int i = 0; i < 12; i++) {
    if (machine[i] == "")
        machine[i] = "NULL";
}

for (int i = 0; i < 3; i++) {
    cout << setw(10) << machine[i] << setw(10) << machine[i+1] << setw(10) << machine[i+2] << endl;
}
return 1;
}
于 2012-06-25T08:15:32.883 回答