Felix Riesterer: MySQL bedingtes Leerzeichen hinzufügen

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.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)

  1. ^,/ ↩︎

  1. Hallo Ingrid,

    SELECT

    CONCAT(
            orte.PLZ,
            ' ',
            orte.Name,
            (
                SELECT
                    ' '

    -- hier fehlt ganz offensichtlich eine FROM-Klausel --

    WHERE
                    orte.Zusatz REGEXP '[1]'
            ),
            orte.Zusatz
        ) AS Ort_detailliert
    FROM orte

      
    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:)
    

    1. ^,/ ↩︎

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

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. IF()

    SELECT  
        CONCAT(  
            `orte`.`PLZ`,  
            ' ',  
            `orte`.`Name`,  
            IF(`orte`.`Zusatz` REGEXP '^[^,/]', ' ', ''),  
            `orte`.`Zusatz`  
        ) AS `Ort_detailliert`  
    FROM `orte`
    
    1. 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

    2. 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
          ) AS Ort_detailliert
      FROM orte

        
      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.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)

      1. ^,/ ↩︎