MySQL bedingtes Leerzeichen hinzufügen
Felix Riesterer
- datenbank
Liebe DB-Experten,
meine SQL-Kenntnisse sind noch immer ungenügend, sodass ich folgendes Problem nicht verstehe bzw. lösen könnte:
Ich möchte zu einem Ortsnamen einen Zusatz ausgeben, der nach einem Leerzeichen stehen soll, wenn dieser Zusatz nicht mit einem Komma oder Slash beginnt.
Beispiel-Ausgaben (gewünscht):
73479 Ellwangen (Jagst)
03226 Vetschau/Spreewald
In obigen Beispielen ist der Zusatz "(Jagst)" mit einem Leerzeichen getrennt, der Zusatz "/Spreewald" nicht.
Mein Ansatz ist dieser:
SELECT
CONCAT(
`orte`.`PLZ`,
' ',
`orte`.`Name`,
(
SELECT
' '
WHERE
`orte`.`Zusatz` REGEXP '^[^,/]'
),
`orte`.`Zusatz`
) AS `Ort_detailliert`
FROM `orte`
Das Ergebnis ist eine Fehlermeldung dieser Art:
MySQL-Fehler (1064) You have an error in your SQL syntax; [...] syntax to use near 'WHERE
orte
.Zusatz
REGEXP '[1]'),orte
.Zusatz
) AS ' at line xyz
Was mache ich falsch? Mir will nicht einleuchten, wo ich da die SQL-Syntax verletze. Wer kann mir weiterhelfen?
Liebe Grüße,
Felix Riesterer.
^,/ ↩︎
Hallo Ingrid,
SELECT
CONCAT(
orte
.PLZ
,
' ',
orte
.Name
,
(
SELECT
' '
-- hier fehlt ganz offensichtlich eine FROM-Klausel --
WHERE
orte
.Zusatz
REGEXP '[1]'
),
orte
.Zusatz
) ASOrt_detailliert
FROMorte
Aber was soll ich als Tabelle angeben, wenn ich eine reine String-Operation durchführen will? Den String selbst als "Tabelle" anzugeben ist Unsinn, da die "Tabelle" `orte`.`Zusatz` natürlich nicht existiert.
Die REPLACE-Funktion ist mir zu "dumm", da sie einen konstanten String als Suche benutzt, ich aber ein Muster ("erstes Zeichen ',' oder '/'") benötige.
Ein preg\_replace() wie in PHP gibt es in (My)SQL anscheinend nicht...
Liebe Grüße,
Felix Riesterer.
--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
^,/ ↩︎
ich aber ein Muster ("erstes Zeichen ',' oder '/'") benötige.
es muss natürlich "erstes Zeichen weder ',' noch '/'" lauten. Das schluckt die REPLACE-Funktion natürlich nicht.
Liebe Grüße,
Felix Riesterer.
IF()
SELECT
CONCAT(
`orte`.`PLZ`,
' ',
`orte`.`Name`,
IF(`orte`.`Zusatz` REGEXP '^[^,/]', ' ', ''),
`orte`.`Zusatz`
) AS `Ort_detailliert`
FROM `orte`
Zusatz, wobei ich weniger RegExp nutzen würde
IF(LEFT(zusatz,1) IN(',','/'), '', ' '),
dürfte auch etwas schneller sein.
Es geht natürlich auch ein CASE..WHEN Konstrukt
Liebe(r) DiBo33,
IF()
Aha! Das kann man in der SELECT-Klausel verwenden? Cool!
SELECT
CONCAT(
orte
.PLZ
,
' ',
orte
.Name
,
IF(orte
.Zusatz
REGEXP '[1]', ' ', ''),
orte
.Zusatz
) ASOrt_detailliert
FROMorte
Jetzt erhalte ich jede Menge Treffer, die ein einziges NULL enthalten. Das liegt daran, dass der Zusatz auch NULL sein kann. Und wenn er Null ist, ist das gesamte Ergebnis NULL. Daher lautet das tatsächlich benötigte SQL-Monster so:
~~~sql
SELECT
CONCAT (
`orte`.`PLZ`,
' ',
`orte`.`Name`,
IF (`orte`.`Zusatz` IS NOT NULL,
CONCAT (
IF (`orte`.`Zusatz` REGEXP '^[^,/]',
' ',
''
),
`orte`.`Zusatz`
),
''
)
) AS `Ort_detailliert`
FROM `orte`
Ganz herzlichen Dank für den entscheidenden Hinweis! Mein Problem ist gelöst.
Liebe Grüße,
Felix Riesterer.
^,/ ↩︎