533 Stimmen

Wie teile ich einen abgegrenzten String auf, um auf einzelne Elemente zugreifen zu können?

Mit SQL Server, wie kann ich einen String aufteilen, um auf Element x zugreifen zu können?

Nehmen wir einen String "Hallo John Smith". Wie kann ich den String nach Leerzeichen aufteilen und auf das Element an Index 1 zugreifen, das "John" zurückgeben sollte?

3 Stimmen

5 Stimmen

Die höchsten Antworten hier sind - zumindest für mich - ziemlich altmodisch und eher veraltet. Prozedurale Logik, Schleifen, Rekursionen, CLR, Funktionen, viele Codezeilen... Es könnte interessant sein, die "aktiven" Antworten zu lesen, um aktuellere Ansätze zu finden.

0 Stimmen

Ich habe eine neue Antwort mit einem aktuelleren Ansatz hinzugefügt: stackoverflow.com/a/49669994/632604

0voto

nazim hatipoglu Punkte 624

Wenn jemand nur einen Teil des getrennten Textes erhalten möchte, kann dies verwendet werden

select * from fromSplitStringSep('Wort1 wort2 wort3',' ')

CREATE function [dbo].[SplitStringSep] 
(
    @str nvarchar(4000), 
    @separator char(1)
)
returns table
AS
return (
    with tokens(p, a, b) AS (
        select 
        1, 
        1, 
        charindex(@separator, @str)
        union all
        select
            p + 1, 
            b + 1, 
            charindex(@separator, @str, b + 1)
        from tokens
        where b > 0
        )
        select
            p-1 nullbasiertesAuftreten,
            substring(
                @str, 
                a, 
                case when b > 0 then b-a ELSE 4000 end) 
            AS s
        from tokens
  )

0voto

Savas Adar Punkte 3695
ERSTELLEN FUNKTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
GIBT ZURÜCK @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

UND VERWENDE ES

select *from dbo.fnSplitString('Querying SQL Server','')

0voto

dani herrera Punkte 43704

Rekursive CTE-Lösung mit Server-Schmerz, testen Sie es

MS SQL Server 2008 Schema Setup:

create table Course( Courses varchar(100) );
insert into Course values ('Hallo John Smith');

Anfrage 1:

with cte as
   ( select 
        left( Courses, charindex( ' ' , Courses) ) as a_l,
        cast( substring( Courses, 
                         charindex( ' ' , Courses) + 1 , 
                         len(Courses ) ) + ' ' 
              as varchar(100) )  as a_r,
        Courses as a,
        0 as n
     from Course t
    union all
      select 
        left(a_r, charindex( ' ' , a_r) ) as a_l,
        substring( a_r, charindex( ' ' , a_r) + 1 , len(a_R ) ) as a_r,
        cte.a,
        cte.n + 1 as n
    from Course t inner join cte 
         on t.Courses = cte.a and len( a_r ) > 0

   )
select a_l, n from cte
--where N = 1

Ergebnisse:

|    A_L | N |
|--------|---|
| Hallo  | 0 |
|  John  | 1 |
| Smith  | 2 |

-1voto

Dave Mason Punkte 4533

Ich weiß, dass dies eine wirklich alte Frage ist, aber ab SQL Server 2016 gibt es Funktionen zum Analysieren von JSON-Daten, die verwendet werden können, um die Frage des OP speziell zu beantworten - und zwar ohne Zeichenfolgen aufzuteilen oder auf eine benutzerdefinierte Funktion zurückzugreifen. Verwenden Sie die JSON_VALUE-Funktion, um auf ein Element an einem bestimmten Index einer durch Kommas getrennten Zeichenfolge zuzugreifen. Allerdings ist korrekt formatierte JSON-Daten erforderlich: Zeichenfolgen müssen in doppelten Anführungszeichen " eingeschlossen sein und das Trennzeichen muss ein Komma , sein, wobei die gesamte Zeichenfolge in eckigen Klammern [] eingeschlossen sein muss.

DECLARE @SampleString NVARCHAR(MAX) = '"Hello John Smith"';
--Als JSON-Daten formatieren.
SET @SampleString = '[' + REPLACE(@SampleString, ' ', '","') + ']';
SELECT 
    JSON_VALUE(@SampleString, '$[0]') AS Element1Value,
    JSON_VALUE(@SampleString, '$[1]') AS Element2Value,
    JSON_VALUE(@SampleString, '$[2]') AS Element3Value;

Ausgabe

Element1Value         Element2Value       Element3Value
--------------------- ------------------- ------------------------------
Hello                 John                Smith

(1 Zeile betroffen)

-1voto

GBGOLC Punkte 460

Mit SQL Server 2016 und höher. Verwenden Sie diesen Code, um Zeichenfolgen zu TRIM, NULL-Werte zu ignorieren und einen Zeilenindex in der richtigen Reihenfolge anzuwenden. Es funktioniert auch mit einem Leerzeichen als Trennzeichen:

DECLARE @STRING_VALUE NVARCHAR(MAX) = 'one, two,,three, four,     five'

SELECT ROW_NUMBER() OVER (ORDER BY R.[index]) [index], R.[value] FROM
(
    SELECT
        1 [index], NULLIF(TRIM([value]), '') [value] FROM STRING_SPLIT(@STRING_VALUE, ',') T
    WHERE
        NULLIF(TRIM([value]), '') IS NOT NULL
) R

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X