2017-03-14 10 views
0

Ich habe eine Datenbank mit Benutzerprofilinformationen geerbt, die eine Spalte für persönliche Interessen enthält. Mehrere Interessen werden durch eine Pipe (|) getrennt. In einer SQL-Abfrage, wie kann geteilt ich ein Feld mit diesem Wert: 2 | 27 | 33 | 14 | 15Parsen eines SQL-Felds in einer Abfrage

Um wie folgt aussehen:

2 
27 
33 
14 
15 
+1

Welche SQL verwenden Sie und haben Sie sich das Handbuch für String-Verarbeitungsfunktionen (Ich gehe davon aus das ein VARCHAR-Feld ist)? Und wie soll die tatsächliche Abfrage und die volle Ausgabe aussehen? – lurker

+0

verwenden Sie etwas wie diese SELECT-Wert FROM STRING_SPLIT (** <> **, '|') – Naidu

Antwort

0

Die genaue Syntax hängt von der dbms Sie verwenden . Angenommen, Sie MSSQL verwenden dies ist die allgemeine Syntax

STRING_SPLIT (string , separator) 

Zum Beispiel

DECLARE @string_to_be_split NVARCHAR(400) = '2|27|33|14|15' 

SELECT value 
FROM STRING_SPLIT(@string_to_be_split, '|') 
WHERE RTRIM(value) <> ''; 
0

Bearbeiten - hätte schwören können, dass ich SQL Server sah

Wenn nicht 2016, fast jede Split/Parse-Funktion reicht aus.

Option 1 - Mit UDF

Declare @YourTable table (ID int,Interests varchar(250)) 
Insert Into @YourTable values 
(1,'2|27|33|14|15') 

Select A.ID 
     ,B.* 
From @YourTable A 
Cross Apply [dbo].[udf-Str-Parse](A.Interests,'|') B 

Option 2 - Ohne UDF

Select A.ID 
     ,B.* 
From @YourTable A 
Cross Apply (
       Select RetSeq = Row_Number() over (Order By (Select null)) 
         ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
       From (Select x = Cast('<x>' + replace((Select replace(A.Interests,'|','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as X 
       Cross Apply x.nodes('x') AS B(i) 
      ) B 

Beide Return

ID RetSeq RetVal 
1 1  2 
1 2  27 
1 3  33 
1 4  14 
1 5  15 

Die UDF, wenn Sie interessieren

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as X 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Thanks Shnugo for making this XML safe 
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',') 
+0

Wie in Orakel zu tun? –

+0

@TomJMuthirenthi Tut mir leid, ich habe Oracle seit fast einem Jahrzehnt nicht mehr berührt, –

Verwandte Themen