1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Zahl in einem String nach einem best. Wort extrahieren

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Datenbank-Neuling, 20 Mai 2020.

  1. 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
     
  2. Tommi

    Tommi Datenbank-Guru

    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
     
  3. 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: 20 Mai 2020
  4. Tommi

    Tommi Datenbank-Guru

    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
     
  5. Irgendwas stimmt da aber noch nicht... LEFT(character_expression, integer_expression) ohne integer_expression?
     
  6. Ok LEFT stimmt aber das mit dem -1 wird nicht akzeptiert in SQL und RTRIM ändert nichts :confused:
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden