2012-06-25 49 views
3

我有一个这样的条目表。如何将字符串分隔成不同的列?

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 
+1

这并非偶然所以你可以将标签应用于元素,是吗? –

+0

@BradChristie没有得到你! – user614978

+1

就像你不明白这个问题?我问你是否主要目的是将标签应用到项目上(几乎像博客一样发布),现在你正在尝试将它们恢复。 –

回答

6

除了使用分割函数外,还有一个名为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] 
+0

我记得一些有关PARSENAME不允许超过4项(因为它用于对象名称和4部分是对象标识符的最大长度) - 所以你可以使用它作为只要你还记得:) – Charleh

+0

是谢谢提醒我,但我认为OP在他的问题中提到只有3列 – praveen

+0

完美...这就是我也完全想要..谢谢一吨:) – user2768132

-4

如果在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; 
} 
+1

这篇文章没有C++标签,是不是有点猜测? – Charleh

+1

您是否诚实地*建议通过从数据库中提取*每条*记录来解决数据库查询,使用C++处理它,然后将所有内容都推回到数据库中? ***真***? – MatBailie

+1

听起来像是从TheDailyWTF到我的恐怖故事:) – Charleh

0

你可以只使用了可以与任何良好的搜索引擎可以找到许多字符串分割功能之一...

大多数情况下只需一个字符串并返回多行,但您需要多列。因此,这一个似乎是一个不错的选择:mysql-split-string-function

然后你只需做这样的事......

SELECT 
    SPLIT_STR(`machine name`, ' ', 1) AS M1, 
    SPLIT_STR(`machine name`, ' ', 2) AS M2, 
    SPLIT_STR(`machine name`, ' ', 3) AS M3 
FROM 
    `yourTable` 
1

试试这个:

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) 

与德姆斯的答案相结合,你应该很好去

(注意,如果指定索引不存在,它将返回NULL)

例如,因为指数3不存在

不知道什么性能等等,虽然,我只是修改,我想这样做它可能是值得重写要多表值分割功能

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

将返回NULL就像MySql版本

2

使用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 
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 
+2

请解释你的代码 –

相关问题