2009-06-17 9 views
0

Ich brauche einen bestimmten Teilkette aus einer Zeichenkette der Form zu ziehen:Finden Sie eine bestimmte Teilkette mithilfe von Transact-SQL

foo=abc;bar=def;baz=ghi 

Zum Beispiel, wie würde ich den Wert von „bar“ aus dieser Zeichenfolge bekommen?

+0

ist die Zeichenkette ein Zeilenwert oder etwas übergeben? – Josh

+0

Haben Sie im db-Schema etwas zu sagen? Solche Werte zu speichern geht dagegen, wie SQL-Datenbanken funktionieren sollen. –

+0

Ich stimme zu. Ich hätte es nicht so entworfen, aber ich muss mit dem vorhandenen Code arbeiten. –

Antwort

1

Sie können charindex und substring verwenden. Zum Beispiel für den Wert von „baz“ suchen:

declare @str varchar(128) 
set @str = 'foo=abc;bar=def;baz=ghi' 

-- Make sure @str starts and ends with a ; 
set @str = ';' + @str + ';' 

select substring(@str, 
    charindex(';baz=',@str) + len(';baz='), 
    charindex('=',@str,charindex(';baz=',@str)) - charindex(';baz=',@str) - 1) 

Oder für den Wert von „foo“ zu Beginn der Zeichenfolge:

select substring(@str, 
    charindex(';foo=',@str) + len(';foo='), 
    charindex('=',@str,charindex(';foo=',@str)) - charindex(';foo=',@str) - 1) 

Hier ist ein UDF dies zu erreichen (mehr lesbare Version von BlackTigerX Antwort inspiriert):

create function dbo.FindValueInString(
    @search varchar(256), 
    @name varchar(30)) 
returns varchar(30) 
as 
begin 
    declare @name_start int 
    declare @name_length int 
    declare @value_start int 
    declare @value_end int 

    set @search = ';' + @search 

    set @name_start = charindex(';' + @name + '=',@search) 
    if @name_start = 0 
     return NULL 

    set @name_length = len(';' + @name + '=') 
    set @value_start = @name_start + @name_length 
    set @value_end = charindex(';', @search, @value_start) 

    return substring(@search, @value_start, @value_end - @value_start) 
end 

Wie Sie sehen können, dies in SQL Server :) Besser tut dies in der Client-Sprache ist nicht einfach, oder Ihre Datenbank normalisieren, so dass der Teil in ihren eigenen Spalten gehen .

+0

Dem stimme ich zu, aber ich brauche nur etwas, das gerade funktioniert. –

+0

Ich sollte jedoch erwähnen, dass "bar" könnte genauso leicht am Anfang oder Ende dieser Zeichenfolge sein. Ich denke nicht, dass Ihre Lösung dafür verantwortlich ist. –

+0

Die Lösung ist lang, aber es sollte funktionieren? Sogar gerade jetzt. :) – Andomar

0

Blick in die PATINDEX-Funktion. Es hat Wildcard-Matching, die Ihnen helfen sollte ..

0

können Sie diese Funktion

alter function FindValue(@txt varchar(200), @find varchar(200)) 
returns varchar(200) 
as 
begin 
declare 
    @firstPos int, 
    @lastPos int 

select @firstPos = charindex(@find, @txt), @lastPos = charindex(';', @txt, @firstPos+5) 

select @lastPos = len(@txt)+1 where @lastPos = 0 

return substring(@txt, @firstPos+len(@find)+1, @[email protected](@find)-1) 
end 


select dbo.FindValue('foo=abc;bar=def;baz=ghi', 'bar') 

Update verwenden: nicht wurde mit der Länge von @find

1

ich eine allgemeine Lösung, die für dieses Problem funktioniert:

CREATE FUNCTION [dbo].[fn_StringBetween] 
(
    @BaseString varchar(max), 
    @StringDelim1 varchar(max), 
    @StringDelim2 varchar(max) 
) 
RETURNS varchar(max) 
AS 
BEGIN 
    DECLARE @at1 int 
    DECLARE @at2 int 
    DECLARE @rtrn varchar(max) 

    SET @at1 = CHARINDEX(@StringDelim1, @BaseString) 
    IF @at1 > 0 
    BEGIN 
     SET @rtrn = SUBSTRING(@BaseString, @at1 
     + LEN(@StringDelim1), LEN(@BaseString) - @at1) 
     SET @at2 = CHARINDEX(@StringDelim2, @rtrn) 
     IF @at2 > 0 
      SET @rtrn = LEFT(@rtrn, @at2 - 1) 
    END 

    RETURN @rtrn 
END 

so, wenn Sie laufen (wickeln Sie einfach Ihre ursprüngliche Zeichenfolge, die mit ';' am Anfang und am Ende durchsucht werden soll):

PRINT dbo.fn_StringBetween(';foo=abc;bar=def;baz=ghi;', ';bar=', ';') 

Sie erhalten 'Def' zurückgegeben.

0

dies unter der Annahme, dass die Zeichenfolge das gleiche String-Format auf die Spaltennamen für die gerade hat ersetzen 'foo = abc; bar = def; baz = ghi'

select substring('foo=abc;bar=def;baz=ghi',patindex('%bar=%','foo=abc;bar=def;baz=ghi')+4, len('foo=abc;bar=def;baz=ghi')-patindex('%;baz=%','foo=abc;bar=def;baz=ghi')-4) 
-1

Diese in einfacher Weise erreichen kann

DECLARE @str VARCHAR(30) 

DECLARE @start INT 

SET @str='foo=abc;bar=def;baz=ghi' 

SET @start=CHARINDEX('bar',@str) 

PRINT SUBSTRING(@str,@start,3) 
Verwandte Themen