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)
不是使用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)
试试这个:
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 版本
| 归档时间: |
|
| 查看次数: |
53869 次 |
| 最近记录: |