Feld LIKE Feld / '%'+table.field+'%'

banshe

Mitglied
Hallo zusammen

Ich möchte gerne direkt auf der Datenbank eine SQL Abfrage tätigen in der ein Feld mit einem anderen verglichen wird:
Code:
SELECT *
FROM TabelleA
LEFT OUTER JOIN `TabelleB` ON TabelleB.FeldB like '%'+TabelleA.FeldA+'%'

Dabei bekomme ich jedoch folgende Fehlermeldung:
Code:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '+TabelleA.FeldA+'%' LIMIT 0, 30' at line 3

Ist mein Vorhaben überhaupt möglich?

Danke und Gruss
 
Aus der Fehlermeldung weiss ich nun, dass es sich um MySQL handelt.

Du verbindest da besser mit CONCAT
SQL:
TabelleB.FeldB LIKE CONCAT('%', TabelleA.FeldA, '%')
 
Zuletzt bearbeitet von einem Moderator:
Hallo und Danke für deine Hilfe..

Habe gerade noch eine Frage dazu:

In der "TabelleA.FeldA" steht beispielsweise "Deutschland DE 123" oder "Schweiz CH 123 45".
Vergleichen möchte ich aber jeweils nur das Wort bis zum ersten Leerschlag - also "Deutschland" oder "Schweiz".

Ist das realisierbar? Wie macht man das?

Aktuelle Query:
Code:
SELECT *
FROM TabelleA
LEFT OUTER JOIN `TabelleB` ON TabelleB.FeldB LIKE CONCAT('%', TabelleA.FeldA, '%')

Vielen Dank nochmals!
 
SUBSTRING_INDEX()
SQL:
TabelleB.FeldB = SUBSTRING_INDEX(TabelleA.FeldA, ' ', 1)
 
Zuletzt bearbeitet von einem Moderator:
Hallo und vielen Dank für deine Hilfe!

Das ganze funktioniert schonmal nicht schlecht..

Code:
SELECT *
FROM TabelleA
LEFT OUTER JOIN `TabelleB` ON TabelleB.FeldB LIKE CONCAT('%', SUBSTRING_INDEX( TabelleA.FeldA, ' ', 1 ), '%')

Jetzt gibt es nurnoch ein Problem(chen)...

Beispielsweise habe ich in der TabelleB.FeldB den Wert "München 4567". Von diesem wird jetzt der erste Teil (also "München") mit den Werten aus der TabelleA.FeldA verglichen.
Das ist auch richtig so.

Gibt es in der TabelleA.FeldA jedoch die Werte "Münchenbuchsee" und "München" bekomme ich beide Werte ausgegeben:
Code:
Stefan - München - *PLZ München*
Stefan - Münchenbuchsee - *PLZ Münchenbuchsee*

Wie kann ich eine Regel einbauen dass; Wenn es >1 Treffer gibt = in der PLZ nichts oder bsp. "Ungültig" ausgibt..

geht das?


Herzlichen Dank und viele Grüsse
 
Warum das LIKE?
Mit dem SUBSTRING_INDEX holst du München. Wennd ue noch die % ANhängst nimmt er nachher alles was München beinhaltet.
Amch es so wie ich oben geschrieben habe. Ohne LIKE und CONCAT
 
Hallo

Hab ich gerade ausprobiert. Mit dieser Lösung gibt es jedoch ein anderes Problem, doch dazu Später.

Ich erkläre zuerst einmal worum es überhaupt geht:
Ich habe 2 Tabellen:

TabelleA
NameFeldA
StefanWohlen bei Bern BE 4567
PeterWohlen BE 123
HansBaden AG 189


TabelleB
PLZFeldB
1111Wohlen
2222Wohlen bei Bern
3333Hamburg
4444Baden
5555Badenbaden


Meine gewünschte Ausgabe:
NameFeldAPLZ
StefanWohlen bei Bern BE 45672222
PeterWohlen BE 1231111
HansBaden AG 1894444


Mit meiner aktuellen Lösung:
Code:
SELECT *
FROM TabelleA
LEFT OUTER JOIN `TabelleB` ON TabelleB.FeldB= SUBSTRING_INDEX( TabelleA.FeldA, ' ', 1 )
wird beispielsweise bei "Wohlen bei Bern BE 4567" nur "Wohlen" genommen und verglichen, daher gibt mir die Query die PLZ "1111" (Wohlen) aus anstatt "2222" (Wohlen bei Bern) aus.

Meine Überlegung daher war dass ich ein "LIKE" verwende. Falls es mehrere Treffer geben sollte (Wohlen & Wohlen bei Bern / Baden & Badenbaden etc.) soll er "ungültig" (oder sowas in der Art) ausgeben.
Dann kann ich in einem zweiten Schritt nach "ungültig" sortieren und diese anschliessend Manuell zuordnen.

Wie kann ich dies realisieren? Oder hast du eine bessere Idee?

Merci und Gruss
 
Ist der Teil den du abschneiden willst immer 'Leerzeiche+2Buchstaben+Leerzeichen+Zahlen'?

Wenn ja, kann man ein REGEXP Muster machen
SQL:
LEFT JOIN .....
    ON felda REGEXP CONCAT('^',feldb, ' [[:alpha:]]{2} [[:digit:]]+$')

Gibt ein Regulärer Ausdruck. Bei 'Wohlen in Bern' sieht er dann so aus
Code:
^Wohlen bei Bern [[:alpha:]]{2} [[:digit:]]+$
Erklärung:
^: Anfang vom string
Wohlen bei Bern : Stringfolge die dann kommen muss
[[:alpha:]]{2}: 2 Buchstaben (Perfekt für unsere Kantonskürzel)
: Gefolgt von einem Leerzeichen
[[:digit:]]+: Eine beliebige Anzahl Ziffern
 
Zuletzt bearbeitet von einem Moderator:
Leider ist der Aufbau nicht immer gleich.
Am Afang kommt immer die Ortschaft, aber anschliessend kommt leider ein haufen Mist.

Zum Teil gibt es in der DB auch solche Einträge:


Gwatt (Thun)
Biel/Bienne
Langnau i. E. Zustellung
Ostermundigen 1 Fächer
Olten / 122​


Das Einträge wie "Biel/Bienne" manuell gemacht werden müssen, ist mir klar.. Aber irgendwie muss erkennbar gemacht werden dass es manuell gemacht werden muss.. z.b. wenn er keinen oder mehrere übereinstimmende Einträge findet.

Vielen Dank für deine hilfe!
 
Wow, was für 'Schrott'daten - Mein Beileid.

Also, ich würde es mit einem LIKE machen. Dann nach feldb gruppieren. Das ganez ergänzen durch ien Flag-Feld, dass besagt, dass es eindeutig ist oder nicht (COUNT()=1). Das felda und plz mit einem GROUP_CONCAT() zusammenführen, so dass man gleich alle möglichen FVarianten drin hat.


SQL:
SELECT
	`name`,
	felda,
	IF(COUNT(*) = 1, TRUE, FALSE) AS eindeutig,
	GROUP_CONCAT(plz SEPARATOR ', ') AS plz,
	GROUP_CONCAT(feldb SEPARATOR ', ') AS feldb
FROM
	tabelleb
	INNER JOIN tabellea
		ON felda LIKE CONCAT('%', feldb, '%')
GROUP BY
	`name`,
	felda
Ergibt in deinem Beispiel
Code:
name   | felda                   | eindeutig | plz        | feldb
-----------------------------------------------------------------------------------
Hans   | Baden AG 189            | 1         | 4444       | Baden
Peter  | Wohlen BE 123           | 1         | 1111       | Wohlen
Stefan | Wohlen bei Bern BE 4567 | 0         | 1111, 2222 | Wohlen, Wohlen bei Bern
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück