luti: Frage zu concate

Hallo,

ich habe in meiner MySQL5-Datenbank Spaltennamen, die auf '_'.$monat enden (also xyz_1, xyz_2, ..., xyz_12); enthaltene Werte sind 0/1. Nun möchte ich eine Abfrage in der Spalte des aktuellen Monats machen. Ich habe folgendes versucht:

SELECT *  
FROM abc  
WHERE  
CONCAT('xyz_',MONTH(NOW())) = 1

Zurückgeliefert werden aber _alle_ Zeilen, auch die mit dem Wert 0. Anscheint funktioniert das CONCAT nicht richtig. Was mache ich da falsch? Liegt es daran, dass Text mit Zahl verbunden wird?

Dank & Gruß,
luti

  1. Hallo,

    ich habe in meiner MySQL5-Datenbank Spaltennamen, die auf '_'.$monat enden (also xyz_1, xyz_2, ..., xyz_12);

    ich halte eine solche Tabellenstruktur in den meisten Fällen für keine besonders gute Idee. Sicher gibt es dafür Anwendungsfälle.

    enthaltene Werte sind 0/1. Nun möchte ich eine Abfrage in der Spalte des aktuellen Monats machen. Ich habe folgendes versucht:

    SELECT *

    FROM abc
    WHERE
    CONCAT('xyz_',MONTH(NOW())) = 1

      
    Nö. Sowas geht in normalem SQL nicht. Du kannst nicht so einfach, mir nichts, Dir nichts, einen Spaltennamen, den Du benötigst, dynamisch im Statement zusammensetzen.  
      
    MySQL 5.0: Benutze [Prepared Statements](http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html) oder baue Dein Statement in der API zusammen.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Hallo,

      danke für Deine Antwort!

      ich halte eine solche Tabellenstruktur in den meisten Fällen für keine besonders gute Idee. Sicher gibt es dafür Anwendungsfälle.

      Darüber kann man natürlich streiten ... ich fand, dass es in diesem Fall eine schnelle + einfache Lösung war, wenn auch nicht sonderlich elegant ;)

      CONCAT('xyz_',MONTH(NOW())) = 1[/code]
      Nö. Sowas geht in normalem SQL nicht. Du kannst nicht so einfach, mir nichts, Dir nichts, einen Spaltennamen, den Du benötigst, dynamisch im Statement zusammensetzen.

      Grumpf. Schade eigentlich.

      MySQL 5.0: Benutze Prepared Statements oder baue Dein Statement in der API zusammen.

      Das geht in diesem speziellen Falle leider nicht. Dann werde ich wohl einen anderen Work-Around über die API nehmen müssen.

      Dank & Gruß,
      luti

      1. Hallo,

        ich halte eine solche Tabellenstruktur in den meisten Fällen für keine besonders gute Idee. Sicher gibt es dafür Anwendungsfälle.

        Darüber kann man natürlich streiten ... ich fand, dass es in diesem Fall eine schnelle + einfache Lösung war, wenn auch nicht sonderlich elegant ;)

        offensichtlich war es keine Lösung.

        Nö. Sowas geht in normalem SQL nicht. Du kannst nicht so einfach, mir nichts, Dir nichts, einen Spaltennamen, den Du benötigst, dynamisch im Statement zusammensetzen.

        Grumpf. Schade eigentlich.

        Ganz im Gegenteil. Ich finde dies wunderbar und sehr sinnvoll.

        MySQL 5.0: Benutze Prepared Statements oder baue Dein Statement in der API zusammen.

        Das geht in diesem speziellen Falle leider nicht. Dann werde ich wohl einen anderen Work-Around über die API nehmen müssen.

        Was geht nicht?

        [ ] Prepared Statements nutzen
        [ ] Statement in der API zusammenbauen
        [ ] Stored Procedure nutzen, die Prepared Statements nutzt

        Freundliche Grüße

        Vinzenz

        1. Hallo,

          offensichtlich war es keine Lösung.

          Naja, bis auf diese Ausnahme schon ...

          Was geht nicht?

          [x] Prepared Statements nutzen
          [ ] Statement in der API zusammenbauen
          [x] Stored Procedure nutzen, die Prepared Statements nutzt

          Die Sache ist, dass ich in einem Backend einen Abfrageteil (AND ...) als Code eingebe, den ich dann in meiner Applikation wieder zusammenbaue. Das hat den Hintergrund, dass ich für verschiedene Kategorien kombinierte Suchabfragen zusammenstellen möchte. (Ohne konkret zu werden ist es wohl etwas unverständlich - sorry.) Ich gebe in einem Auswahlfeld z.B. "AND aufwand=1" ein. In der Applikation stückele ich dann zusammen "SELECT abc FROM xyz WHERE foo=faa AND aufwand=1". Meine Lösung besteht nun darin, dass ich einen Platzhalter im Eingabefeld verwende, z.B. *THISMONTH*. Beim Zusammenfügen ersetze ich dann *THISMONTH* durch 'xyz_'.$thismonth ...

          Danke noch mal & Grüße,
          luti