2015-05-20 3 views
8

У меня есть строка, как нижеSplit подстрока, которая возвращается из расщепленной функции

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 

Но я не знаю, как я могу продолжить следующий раскол с этими результатами?

Используя временную таблицу, я надеюсь, что смогу это сделать, но мне нужно использовать ее внутри функции. Поэтому я считаю, что временная таблица не является хорошим вариантом. Курсор также является опцией, но когда я использую курсор, это ухудшит производительность, потому что у меня есть тысячи записей.

Мой вход:

a_b|c_d 

И желательно из пут:

a 
b 
c 
d 
+2

Вы считали, что используете тип данных * designed * для хранения нескольких значений, таких как xml или таблицы, вместо того, чтобы создавать эту проблему для себя в первую очередь? –

ответ

7

Вы можете лучше использовать Sql Replace функции первого, а затем использовать сплит функции, как показано ниже

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

results: a_b_c_d 

Теперь использовать Split функции, как показано ниже

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

EDIT:

Все в то время,

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

EDIT1:

В этом случае используйте опцию Replace в обратном

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

yup попробует .. спасибо за ваше действительное предложение –

+0

Спасибо, что ваше решение работает, но неудовлетворительно, я не могу использовать это решение, потому что _ и | могут иметь разные значения в моей логике. поэтому, когда я заменяю | с _ то вся логика не сработает –

+0

в любом случае ваш ответ дает ответ на мой вопрос. Так что его нужно принять. –

2

в SQL есть CURSOR

затем использовать fetch, чтобы каждый SubString с 1 выберите

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

Когда я использую курсор, это ухудшит производительность. Мне нужно разделить длинную строку на основе многих условий, и мне нужно сделать это с помощью запроса на соединение, так что может быть, у него тысячи записей. поэтому, когда я использую курсор, то для каждой записи мне нужно зацикливать, чтобы она ухудшилась. –

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 ; 
5

Вы можете использовать CROSS APPLY следующим образом.

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

спасибо за помощь кросс применять это хороший вариант .. –

+0

жаль, что показывает ошибка Msg 102, Level 15, State 1, Line 2 Неправильный синтаксис около '.'. –

+0

ах, это потому, что я смотрю название схемы из вашего исходного вопроса – ughai

0

Используйте это может быть поможет

select items from bdo.splitdetails(REPLACE('a_b|c_d','|','_'),'_') 
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 
+0

Спасибо за хорошее решение. –

Смежные вопросы