Mit SQL Zeichen ersetzen

noobie

Benutzer
Beiträge
11
Hallo,

wie ersetze ich in folgendem String alle Zeichen durch eine 0 die nicht gleich 1 sind.
Code:
declare @String varchar(max)='12311112111111111111111111111241111111172111111111111111111111111111111111111111111111111111111111111211'

Außerdem stellt sich mir noch eine weitere Frage:

Wie bekomme ich aus dem oben angeführten String die Position der anderen Zeichen heraus.

e.g. 2;3;8;30;31;40;41;102


LG
Noobie
 
Werbung:
Ich weiß nicht, ob Di rdas hilft, in PostgreSQL ginge dies so:

Code:
test=*# select regexp_replace('12311112111111111111111111111241111111172111111111111111111111111111111111111111111111111111111111111211','[^1]','0','g');
  regexp_replace   
----------------------------------------------------------------------------------------------------------
 10011110111111111111111111111001111111100111111111111111111111111111111111111111111111111111111111111011
(1 Zeile)

--
-- und eine Funktion
--

test=*# create or replace function split_string(in s text) returns setof int as $$declare l int; begin l:= 1; while l <= length(s) loop if substring(s,l,1) != '1' then return next l; end if;l:=l+1;end loop;end;$$language plpgsql;
CREATE FUNCTION
test=*# select split_string('12311112111111111111111111111241111111172111111111111111111111111111111111111111111111111111111111111211');
 split_string
--------------
  2
  3
  8
  30
  31
  40
  41
  102
(8 Zeilen)

--
-- oder aggregiert
--
test=*# select array_agg(split_string) from (select split_string('12311112111111111111111111111241111111172111111111111111111111111111111111111111111111111111111111111211'))x;
  array_agg   
-------------------------
 {2,3,8,30,31,40,41,102}
(1 Zeile)
 
Hallo noobie,

in T-SQL kanns dann so aussehen:

Code:
declare @String varchar(max)='12311112111111111111111111111241111111172111111111111111111111111111111111111111111111111111111111111211'
 
; WITH cte_s as
(SELECT 1 as i, (CASE WHEN SUBSTRING(@String, 1, 1) NOT IN ('0', '1') THEN '0' ELSE SUBSTRING(@String, 1, 1) END)  as v,
SUBSTRING(@String, 1, 1) as v_org
 
UNION ALL
 
SELECT i+1 as i,
(CASE WHEN SUBSTRING(@String, i+1, 1) NOT IN ('0', '1') THEN '0' ELSE
SUBSTRING(@String, i+1, 1) END) as v,
SUBSTRING(@String, i+1, 1) as v_org
FROM cte_s
WHERE i+1 <= LEN(@String)
 
)
,cte_e as (
SELECT (
SELECT ',' + v
from cte_s
FOR XML PATH('')) as b
 
)
 
SELECT REPLACE(b, ',', '') as e
FROM cte_e
OPTION (MAXRECURSION 0)

Um eine Schleifenfunktion kommst du also leider nicht rum.

Viele Grüße,
Tommi
 
Oh, hab die Frage falsch verstanden. Habe gedacht, die sollen ersetzt werden - sorry
Dann ist aber der grundsatz richtig, nur die Ergebnisabfrage muss dann anders aussehen.

Code:
declare @String varchar(max)='12311112111111111111111111111241111111172111111111111111111111111111111111111111111111111111111111111211'
 
; WITH cte_s as
(SELECT 1 as i, (CASE WHEN SUBSTRING(@String, 1, 1) NOT IN ('0', '1') THEN '0' ELSE SUBSTRING(@String, 1, 1) END)  as v,
SUBSTRING(@String, 1, 1) as v_org
 
UNION ALL
 
SELECT i+1 as i,
(CASE WHEN SUBSTRING(@String, i+1, 1) NOT IN ('0', '1') THEN '0' ELSE
SUBSTRING(@String, i+1, 1) END) as v,
SUBSTRING(@String, i+1, 1) as v_org
FROM cte_s
WHERE i+1 <= LEN(@String)
 
)
 
 
select
STUFF((Select ';' + CAST(i as varchar(10))
from cte_s
WHERE v = '0'
FOR XML PATH('')),1,1,'')
OPTION (MAXRECURSION 0)
 
Danke das ist perfekt :)

Kannst du mir noch sagen wie ich statt dem cte_s den folgenden Table verwenden kann?

declare @Flag table (ID int, Flag int, FlagO int)

LG
Lukas
 
Werbung:
Danke für eure unterstützung, habe es nun wie folgt gelöst.

Code:
declare @String varchar(max)
declare @Numbers varchar(max)
declare @i int = 0
declare @max smallint = 0
declare @Flag as table(ID smallint Identity(1,1), Flag int, Content int)
       
    select @max = LEN(@String)-1
    while @i <= @max
        begin
            INSERT INTO @Flag
            SELECT (CASE WHEN SUBSTRING(@String, @i+1, 1) NOT IN ('0', '1') THEN '0' ELSE
                    SUBSTRING(@String, @i+1, 1) END),
                    SUBSTRING(@String, @i+1, 1)
            set @i=@i+1
        end

    SET @Numbers=(select STUFF((Select ';' + CAST(ID as varchar(10))
                        FROM @Flag
                        WHERE Flag = '0'
                        FOR XML PATH('')),1,1,''))
 
Zurück
Oben