我有一个包含这样条目的表格。
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
答案 0 :(得分: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]
答案 1 :(得分: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)
e.g。
SELECT dbo.SplitIndex(' ', 'Hello World', 3)
将返回NULL,因为索引3不存在
不确定性能是什么样的,我刚刚修改了一个表值分割函数,我已经完成了所以它可能值得重写,更像是MySql版本
答案 2 :(得分: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
答案 3 :(得分: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
答案 4 :(得分:-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;
}