2015-05-20 4 views
8

ho una stringa come sottoSplit una stringa che restituisce da una funzione split

a_b|c_d 

e ho bisogno di dividerlo in base a |.

Quindi, il risultato sarà:

a_b 
c_d 

Poi, voglio dividere di nuovo con _, poi risultato sarà:

a 
b 

c 
d 

E 'possibile fare questo in un unico passo? Come quando l'ingresso corrispondente stringa, verrà restituito un valore come segue:

a 
b 
c 
d 

ho creato una funzione per parti separate:

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

risultato sarà:

a_b 
c_d 

Ma non so come posso procedere alla prossima scissione con questi risultati?

Utilizzando la tabella temporanea, spero di poterlo fare, ma ho bisogno di usarlo all'interno di una funzione. Quindi penso che il tavolo temporaneo non sia una buona opzione. Anche il cursore è un'opzione, ma quando uso il cursore, degraderà le prestazioni perché ho migliaia di record.

mio ingresso è:

a_b|c_d 

e mettere desiderata out:

a 
b 
c 
d 
+2

Hai mai pensato di utilizzare un tipo di dati * progettato * per contenere più valori, come xml o tabelle, piuttosto che creare questo problema per te stesso in primo luogo? –

risposta

7

È possibile utilizzare meglio Sql funzione Replace prima e poi utilizzare la funzione split, come di seguito

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

results: a_b_c_d 

Ora utilizzare la funzione Split come qui di seguito

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

EDIT:

Tutto in un momento

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

Edit1:

In tal caso, utilizzare l'opzione Sostituisci in Reverse

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

yup avrò un tentativo .. grazie per il tuo suggerimento valido –

+0

Grazie la tua soluzione sta funzionando ma sfortunatamente non posso usare questa soluzione perché _ e | può avere significati diversi nella mia logica. così quando sostituisco | con _ allora l'intera logica fallisce –

+0

in ogni caso la tua risposta dà risposta alla mia domanda. Quindi deve essere accettata. –

2

in SQL c'è un CURSOR

quindi utilizzare fetch per ottenere ogni SubString dal 1 selezionare

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

quando uso il cursore peggiorerà le prestazioni, devo dividere una stringa lunga in base a molte condizioni e ho bisogno di farlo con una query di join, quindi potrebbe avere migliaia di record. quindi quando uso il cursore, quindi per ogni record ho bisogno di fare un ciclo in modo che peggiorerà le prestazioni –

1

funziona questo aiuto ..

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

È possibile utilizzare CROSS APPLY come questo.

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

grazie per l'aiuto cross apply è una buona opzione .. –

+0

scusa mostra un messaggio di errore 102, livello 15, stato 1, riga 2 Sintassi errata vicino a '.'. –

+0

ah, è perché guardo il nome dello schema dalla tua domanda originale – ughai

0

Usa questo può essere aiutare

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

È possibile utilizzare PATINDEX funzione per dividere la stringa da più delimitatori. Ecco la funzione completa e l'output di esempio.

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

Grazie bella soluzione. –