Zahl in einem String nach einem best. Wort extrahieren

Mr. Robot

Fleissiger Benutzer
Beiträge
88
Hallo Zusammen,

ich habe ein Text Feld (String) mit unterschiedlicher länger und möchte immer die Zahl nach ALT und NEU einlesen. Kennt Ihr einen Befehl der z.B. nach dem Wort ALT: die Zahl einlesen könnte? Leider taucht dieser auch immer in unterschiedlicher Darstellung auf:

HTML 4.1// <html><head><title><body><br />ALT: 51,-- <br /> <br />NEU: 12,-- <br />
HTML 4.1// <html><head><body><br />ALT: 33 € <br /> <br />NEU: 23 € <br />
HTML 4.1// <html><head><body><br />ALT: 43€ <br /> <br />NEU: 53€ <br />
HTML 4.1// <html><head><title><head><body><br />ALT: 44 <br /> <br />NEU: 41 <br />
HTML 4.1// <html><br />ALT: EUR 44 <br /> <br />NEU: EUR 41 <br />

Viele Grüße
 
Werbung:
Hi,

meine erste idee wäre, die textzeilen in ein xml umzuwandeln und die Werte dann einzeln abzufragen.
Das macht allerding eine umfangreiche Text-Umwandlung erforderlich.
Für deine Beispiele habe ich das mal berücksichtigt, aber es gibt bestimmt noch weitere Varianten, die zu berücksichtigen sind.

Code:
IF OBJECT_ID('TempDB..#tmp') IS NOT NULL DROP TABLE #tmp
CREATE TABLE #tmp
(
    ID int IDENTITY(1,1),
    txt varchar(max)
)

INSERT INTO #tmp (txt)
VALUES
('HTML 4.1// <html><head><title><body><br />ALT: 51,-- <br /> <br />NEU: 12,-- <br />'),
('HTML 4.1// <html><head><body><br />ALT: 33 € <br /> <br />NEU: 23 € <br />'),
('HTML 4.1// <html><head><body><br />ALT: 43€ <br /> <br />NEU: 53€ <br />'),
('HTML 4.1// <html><head><title><head><body><br />ALT: 44 <br /> <br />NEU: 41 <br />'),
('HTML 4.1// <html><br />ALT: EUR 44 <br /> <br />NEU: EUR 41 <br />')

;WITH cte_tmp1
AS
(
    SELECT *,
    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(txt, 'HTML 4.1// <html>', ''), '<head>', ''), '<title>', ''), '<body>', ''), ' ', '') as ntxt
    FROM #tmp
)
,cte_tmp2
AS
(
    SELECT
    ID,
    txt,
    ntxt,
    CONVERT(xml, REPLACE(REPLACE(REPLACE(ntxt, '<br/>ALT:', '<alt>'), '<br/><br/>NEU:', '</alt><neu>'), '<br/>', '</neu>')) as ntxt_xml
    FROM cte_tmp1
)

SELECT *,
ntxt_xml.value('./alt[1]', 'varchar(50)') as txt_alt,
ntxt_xml.value('./neu[1]', 'varchar(50)') as txt_neu
FROM cte_tmp2

Viele Grüße,
Tommi
 
Hi Tommi,

der Weg scheint mir recht kompliziert, da die Ausdrücke <> noch recht lang und unterschiedlich sein können. Da aber die Abstände zw. ALT und NEU immer identisch sind habe ich folgendes gemacht:

SUBSTRING([SPALTENNAME], CHARINDEX('ALT', [SPALTENNAME]), CHARINDEX('NEU', [SPALTENNAME]) - CHARINDEX('ALT', [SPALTENNAME]))

Ich müsste nur noch aus diesem String die Zahlen extrahieren. Kann man da vielleicht was mit REGEXP oder ähnlichem machen?

PS: ich arbeite mit MS SQL. Da gibt es glaube ich gar kein REGEXP
 
Zuletzt bearbeitet:
Hi,

geht natürlich auch mit SUBSTRING - keine Frage, meine erste Idee entstammte auch aus dem Konstrukt mit den HTML-Tags - vielleicht nicht die beste Idee - aber elegant :cool:

mit SUSTRING hätte ich es dann so gelöst:

Code:
SELECT *,
RTRIM(LEFT(SUBSTRING(txt, CHARINDEX('ALT:', txt)+5, 255), CHARINDEX('<', SUBSTRING(txt, CHARINDEX('ALT:', txt)+5, 255))-1)) as tx_alt,
RTRIM(LEFT(SUBSTRING(txt, CHARINDEX('NEU:', txt)+5, 255), CHARINDEX('<', SUBSTRING(txt, CHARINDEX('NEU:', txt)+5, 255))-1)) as tx_neu
FROM #tmp

(aus dem obrigen Code die Erstellung und den INSERT der temporären Tabelle beibehalten).

Viele Grüße,
Tommi
 
Werbung:
Eigentlich funktioniert das. Mit einer fixen Länge von 255 ist natürlich etwas schmutzig aber für die gezeigten Testdaten läuft das bei mir. Eventuell hast du einfach nur was nicht identlisch übernommen?
 
Zurück
Oben