# nach Muster suchen und aus Ergebnis löschen



## Grafixboy (3. Februar 2015)

Hallo habe mal wieder eine Frage.

Ich habe eine MySQL - DB-Tabelle `daten` in der gibt es eine Spalte `standard`
darin enthalten ist folgender content:
variabler Text (text bla Zahl)
Besipiel:
"Die ist der Text (gültig für 4 Tage)"

ich möchte jetzt aus der spalte `standard `  den Teil in der Klammer in eine leere Tabellenspalte `leer`.


```
standard               |  leer
"Die ist der Text" |  (gültig für 4 Tage)
```

ich hoffe ich habe mich verständlich ausgedrückt und auf eure Hilfe.

Danke im vorraus.


----------



## Yaslaw (3. Februar 2015)

Mein Test-SELECT

```
SELECT
	TRIM(SUBSTRING_INDEX(standard,'(', 1)) AS standard,
	RIGHT(standard, LOCATE('(', standard)+1) AS leer
FROM
	(SELECT 'Die ist der Text (gültig für 4 Tage)' AS standard) my_table
```


----------



## Grafixboy (5. Februar 2015)

Ich habe das Problem dann doch mit drei seperaten Abfragen und der replace funktion gelößt bekommen.
ich könnte diese schneller Methode aber in naher Zukunft benötigen und möchte gerne dazulernen.
Ok das aufteilen funktioniert so . mit trim() und right() nur ist der Text ja wie oben beschrieben von variabler länge.
Wenn ich das versuche auf mehrere anzuwenden wendet er den Abstand an Zeichen bis zum ersten vorkommen von "(" auf alle an. Es müsten die beiden Funktionen ja auf jeden Datensatz von dem Select angewendet werden.
Das muss man doch sicher über eine Procedur lösen nur wie?


----------



## Yaslaw (5. Februar 2015)

Hä?


Grafixboy hat gesagt.:


> Wenn ich das versuche auf mehrere anzuwenden wendet er den Abstand an Zeichen bis zum ersten vorkommen von "(" auf alle an. Es müsten die beiden Funktionen ja auf jeden Datensatz von dem Select angewendet werden.
> Das muss man doch sicher über eine Procedur lösen nur wie?


Hä?
Auf mehrere was?
Kommen mehrere ( im String vor?
Warum eine Procedure?


----------



## Grafixboy (5. Februar 2015)

Wie oben beschrieben habe ich ja eine Tabelle in dieser kommen die Eingaben in unterschiedlicher Form einher.
Spalte "standard"
Dies ist der Text (gültig für 4 Tage)
Dies ist ein anderer Text (gültig für 2 Tage)
Und das ist wieder ein ganz anderer Text ( ewige gültigkeit)
usw. und davon mehrere Tausende Einträge

nun war es so gewollt das der Inhalt auf zwei spalten "standard" und "leer" verteilt wird
Spalte "standard"
Dies ist der Text
Dies ist ein anderer Text
Und das ist wieder ein ganz anderer Text

Spalte "leer"
(gültig für 4 Tage)
(gültig für 2 Tage)
( ewige geltend)

ich hoffe jetzt wird es deutlicher

beholfen hatte ich mir jetzt auf diese art

```
SELECT `standard`, `leer` FROM `daten` WHERE `leer` LIKE "%(gültig für 4 Tage)%"
SELECT `standard`, `leer` FROM `daten` WHERE `standard` LIKE "%(gültig für 4 Tage)%";
SELECT `standard`, `leer` FROM `daten` WHERE `leer`="(gültig für 4 Tage)";
UPDATE `daten` SET `leer` ="(gültig für 4 Tage)" WHERE `standard` LIKE "%(gültig für 4 Tage)%";
UPDATE `daten` SET `standard`=REPLACE(`standard`,"(gültig für 4 Tage)","");
```

und das habe ich dann für die Anzahl Varianten wiederholt ging dann zwar auch ist aber nicht besonders elegant und dauert länger

und wie das jetzt leichter geht war meine wissbegier


----------



## Yaslaw (5. Februar 2015)

OK, die Herleitung von `leer` war bei mir falsch
So müsste es gehen

Test-Select

```
SELECT
    TRIM(SUBSTRING_INDEX(standard,'(', 1)) AS standard,
    SUBSTR(standard FROM LOCATE('(', standard)) AS leer
FROM
    (
	 	SELECT 'Die ist der Text (gültig für 4 Tage)' AS standard
	 	UNION SELECT 'Dies ist ein anderer Text (gültig für 2 Tage)' AS standard
	 	UNION SELECT 'Und das ist wieder ein ganz anderer Text ( ewige gültigkeit)' AS standard
	) my_table
```


```
| standard                                 | leer                |
------------------------------------------------------------------
| Die ist der Text                         | (gültig für 4 Tage) |
| Dies ist ein anderer Text                | (gültig für 2 Tage) |
| Und das ist wieder ein ganz anderer Text | ( ewige gültigkeit) |
```

Daraus abgeleitet 

```
UPDATE
	daten
SET
   standard = TRIM(SUBSTRING_INDEX(standard,'(', 1)),
	leer = SUBSTR(standard FROM LOCATE('(', standard))
```

wobei es mir nicht gefällt, die Spalte standard zu überschreiben.Besser zuerst eine neue Spalte standard_original hinzufügen, den Inhalt von standard hinein kopieren und diese dann als Quelle nehmen


----------



## Grafixboy (5. Februar 2015)

Ok diese Lösung ist schon besser wenn mann nur eine Hand voll unterschiedlicher Varianten hat die mann sich ja mittels DISTINCT aus geben lassen kann, nun ist bei mir der Teil vor der Klammer so variable das es fast so viele Variationen wie Datensätze gibt denn nur der Teil in der Klammer kommt nur in einer handvoll variationen vor. deshalb meine Frage ob es denn auch folgender Maßen geht?

```
SELECT
    TRIM(SUBSTRING_INDEX(standard,'(', 1)) AS standard,
    SUBSTR(standard FROM LOCATE('(', standard)) AS leer
FROM
    (
                     SELECT `standard` FROM `daten` WHERE `standard` LIKE '%(gültig für 4 Tage)%' AS standard
        UNION SELECT `standard` FROM `daten` WHERE `standard` LIKE '%(gültig für 2 Tage%)' AS standard
        UNION SELECT `standard` FROM `daten` WHERE `standard` LIKE '%( ewige gültigkeit)%' AS standard
    ) daten
```


geht das so? Dann wäre es prima.


----------

