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

Ludovic Aubert Punkte 8146
CREATE TABLE test(
    id int,
    adress varchar(100)
);
INSERT INTO test VALUES(1, 'Ludovic Aubert, 42 rue de la Victoire, 75009, Paris, France'),(2, 'Jose Garcia, 1 Calle de la Victoria, 56500 Barcelona, Espana');

SELECT id, value, COUNT(*) OVER (PARTITION BY id) AS n, ROW_NUMBER() OVER (PARTITION BY id ORDER BY (SELECT NULL)) AS rn, adress
FROM test
CROSS APPLY STRING_SPLIT(adress, ',')

enter image description here

0 Stimmen

Moderne SQL > TSQL

0voto

Josef B. Punkte 149

Geänderte Funktion von @Aaron Bertrand

CREATE FUNCTION [dbo].[SplitString]
(
    @List NVARCHAR(MAX),
    @Delim VARCHAR(255),
    @Idx int
)
RETURNS NVARCHAR(1000)
AS
BEGIN
    DECLARE @ValueTable TABLE(String NVARCHAR(50), Ind int)
    DECLARE @Value NVARCHAR(50)
    BEGIN
    INSERT INTO @ValueTable
    SELECT Value, idx FROM
        (SELECT [Value], idx = RANK() OVER (ORDER BY n) FROM 
              ( 
                SELECT n = Number, 
                [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
                CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
                FROM    
                        (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
                         FROM sys.all_objects) AS x
                WHERE Number <= LEN(@List)
                AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
              ) AS y
          ) AS R WHERE idx = @Idx
    SET @Value = (SELECT String FROM @ValueTable)
    END
    RETURN @Value
END
GO

0voto

hello_earth Punkte 1210

Basierend auf der Lösung von @NothingsImpossible oder eher auf dem Kommentar zur meistgewählten Antwort (kurz unter der akzeptierten), habe ich die folgende quick-and-dirty Lösung gefunden, die meinen eigenen Bedürfnissen entspricht - sie hat den Vorteil, ausschließlich im SQL-Bereich zu sein.

Angenommen, ich habe einen String "erstes;zweites;drittes;viertes;fünftes", und ich möchte das dritte Token erhalten. Dies funktioniert nur, wenn wir wissen, wie viele Tokens der String haben wird - in diesem Fall sind es 5. Also mein Vorgehen ist, die letzten beiden Tokens wegzuschneiden (innere Abfrage) und dann die ersten beiden Tokens wegzuschneiden (äußere Abfrage).

Ich weiß, dass dies hässlich ist und die spezifischen Bedingungen abdeckt, in denen ich mich befand, aber ich veröffentliche es nur für den Fall, dass es für jemanden nützlich ist. Prost

select 
    RÜCKWÄRTS(
        TEILSTRING(
            reverse_substring, 
            0, 
            CHARINDEX(';', reverse_substring)
        )
    ) 
from 
(
    select 
        msg,
        TEILSTRING(
            RÜCKWÄRTS(msg), 
            CHARINDEX(
                ';', 
                RÜCKWÄRTS(msg), 
                CHARINDEX(
                    ';',
                    RÜCKWÄRTS(msg)
                )+1
            )+1,
            1000
        ) reverse_substring
    from 
    (
        select 'erstes;zweites;drittes;viertes;fünftes' msg
    ) a
) b

0 Stimmen

dies funktioniert nur, wenn wir wissen, wie viele Tokens der String haben wird - eine einschränkende Begrenzung...

0voto

Smart003 Punkte 1087
declare @strng varchar(max)='hallo john smith'
select (
    substring(
        @strng,
        charindex(' ', @strng) + 1,
        (
          (charindex(' ', @strng, charindex(' ', @strng) + 1))
          - charindex(' ',@strng)
        )
    ))

0voto

Ali CAKIL Punkte 322

Ich habe das entwickelt,

declare @x nvarchar(Max) = 'ali.veli.deli.';
declare @item nvarchar(Max);
declare @splitter char='.';

while CHARINDEX(@splitter,@x) != 0
begin
set @item = LEFT(@x,CHARINDEX(@splitter,@x))
set @x    = RIGHT(@x,len(@x)-len(@item) )
select @item as item, @x as x;
end

Die einzige Aufmerksamkeit, die Sie beachten sollten, ist, dass der Punkt '.' am Ende des @x immer vorhanden sein sollte.

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