拆分从拆分函数返回的子字符串

时间:2015-05-20 05:58:16

标签: sql-server string sql-server-2008

我有一个如下所示的字符串

function getUserPosition(callback) {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(

        function (position) {
            callback(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
        }, function () {
            callback(defaultPosition()); // #2
        });
    } else {
        callback(defaultPosition()); // #3
    }
}

getUserPosition(function(latLng){
    //do all operations that depends on latLng here in the callback function
})

我需要根据#CheckBox1 { margin-top: 700px; } #CheckBox2 { margin-top: 700px; } 拆分它。

所以,结果将是:

a_b|c_d

然后,我想再次使用|拆分它,结果将是:

a_b
c_d

是否可以一步完成?就像输入相应的字符串一样,它将返回如下值:

_

我创建了一个拆分函数:

a
b

c
d

结果是:

a
b
c
d

但我不知道如何使用这些结果进行下一次拆分?

使用临时表,我希望我能做到这一点,但我需要在函数中使用它。所以我认为临时表不是一个好选择。游标也是一个选项,但是当我使用游标时,它会降低性能,因为我有数千条记录。

我的意见是:

select items from dbo.splitdetails('a_b|c_d','|')

希望出局是:

a_b
c_d

6 个答案:

答案 0 :(得分:7)

您可以先使用Sql Replace函数,然后使用下面的分割函数

select REPLACE('a_b|c_d','|','_')

results: a_b_c_d

现在使用您的分割功能,如下所示

select items from dbo.splitdetails('a_b_c_d','_')

编辑:

一次一个

select items from dbo.splitdetails(REPLACE('a_b|c_d','|','_'),'_')

EDIT1:

在这种情况下,使用“反向”中的“替换”选项

select items from dbo.splitdetails(REPLACE('a_b|c_d','_','|'),'|')

答案 1 :(得分:5)

您可以像这样使用CROSS APPLY

SELECT d.item,e.item from dbo.splitdetails('a_b|c_d','|') d
CROSS APPLY dbo.splitdetails(d.item,'_') e

答案 2 :(得分:2)

在sql中有一个CURSOR

然后使用fetch从第一次选择中获取每个SubString

DECLARE db_cursor CURSOR FOR  
select items 
from bdo.splitdetails('a_b|c_d','|')

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @items

WHILE @@FETCH_STATUS = 0   
BEGIN   
   select SubString
   from bdo.splitdetails(@items,'_')

   --do something on SubString--

   FETCH NEXT FROM db_cursor INTO @items
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

答案 3 :(得分:1)

这有帮助..

With value(Item) as 
(
select items from bdo.splitdetails('a_b|c_d','|')
)
Select x.Items from value a
cross apply ( 
select items from bdo.splitdetails(a.Item,'_')
) x ;

答案 4 :(得分:1)

您可以使用PATINDEX函数将字符串拆分为多个分隔符。这是完整的功能和示例输出。

CREATE FUNCTION [dbo].[splitdetails]
(
    @input VARCHAR(100),
    @delim VARCHAR(100)
)
RETURNS @table TABLE
(
    items VARCHAR(100)
)
AS
BEGIN
    DECLARE @index INT;
    SET @index = PATINDEX(@delim, @input)
    WHILE @index > 0
    BEGIN
        INSERT INTO @table SELECT LEFT(@input, @index - 1)
        SET @input = RIGHT(@input, LEN(@input) - @index)
        SET @index = PATINDEX(@delim, @input)
    END
    INSERT INTO @table SELECT @input
    RETURN
END
GO

SELECT items FROM dbo.splitdetails('a_b|c_d', '%[_|]%')
-- a
-- b
-- c
-- d

SELECT items FROM dbo.splitdetails('xxx|yyy', '%[_|]%')
-- xxx
-- yyy

SELECT items FROM dbo.splitdetails('xxxxxxx', '%[_|]%')
-- xxxxxxx

答案 5 :(得分:0)

使用此功能可能会有所帮助

select items from bdo.splitdetails(REPLACE('a_b|c_d','|','_'),'_')