Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Im Select auf Variablen zugreifen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von alexfrenzel92, 6 August 2015.

  1. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Hallo,

    Kann ich im Select eine Variable einbauen, die auf das zugreift, was vorher bestimmt wurde?

    Nach diesem Schema:
    $willSpalte = F2;
    $Abfrage1 = 'SELECT * FROM `tabelle` WHERE $willSpalte = 1';
    $Abfrage2 = 'SELECT * FROM `tabelle` WHERE $willSpalte = 2';
    $Abfrage3 = 'SELECT * FROM `tabelle` WHERE $willSpalte = 3';

    Nun soll ich allen Abfragen auf die Spalte "F2" zugegriffen werden.

    mfG
    Danke im Vorraus
    Alex
     
  2. ukulele

    ukulele Datenbank-Guru

    Mit dynamischem SQL geht das, in etwa so:

    Code:
    DECLARE    @willSpalte VARCHAR(10),
            @query VARCHAR(8000)
    
    SET        @willSpalte = 'F2'
    SET        @query = 'SELECT * FROM `tabelle` WHERE ' + @willSpalte + ' = 1:'
    EXEC(@query)
    Warum du jetzt 3 Abfragen machen willst ist mir nicht ganz klar, du könntest ja auch einfach eine Tabelle mit der Spalte zurück geben...
     
  3. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Das war ein Beispiel, um die Sache einfach rüber zu bringen. In Wirklichkeit kommen Dinge, wie Inserts, Joins, Counts und Ifs dazu.
    Ich habe einen Abfragenpool in einem Skript mit mehr als 50 Abfragen, die alle auf die gleiche Spalte zugreifen.
    Das gleiche Skript würde ich gerne mit exakt denselben Abfragen verwenden während alle 50 Abfragen eben auf eine andere Spalte auch teilweise auch mit anderen Werten zugreifen.

    Das heißt, vor jede der Abfragen müsste ein SET oder?
    Ich bekomme immer die Fehlermeldung, wenn ich ein @ irgendwo verwende
    Code:
    Parse error: syntax error, unexpected '@', expecting '(' in[...]
     
  4. ukulele

    ukulele Datenbank-Guru

    Also das @ ist in MSSQL gängig, in MySQL gibt es glaube ich keine Vorschrift, wie eine Variable zu heißen hat. Mit $ sollte es wohl funktionieren.

    Das SET ist nicht so ausschlaggebend. Bei dynamischem SQL baust du einfach nur deine eigentliche Abfrage als String zusammen und führst sie mit EXEC() aus. Das Zusammenbauen kann sehr simpel oder sehr komplex sein, auch mit Schleifen etc. In MySQL sollte das glaube ich auch gehen.
     
  5. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Und wie sähe es bei drei Abfragen aus?

    ... Dann könnte ich gleich dort wo + @willSpalte + in der Abfrage steht, F2 reinschreiben.

    Warum kann man denn nicht einfach bevor die Abfrage (mit SELECT FROM...) definiert wird eine weitere Variable festlegen?
    Warum nimmt SQL die $Variable nicht, wenn er 'SELECT $Variable' in der Abfrage behandelt?

    Ich mache das, weil ich alle fünfzig Abfragen per Copy and Past woanders einfügen will, jedoch während alle Abfragen jeweils an einer einzigen Stelle (dort wo die Variable steht) anders aussehen und der Rest gleich bleibt.

    Aber ich merke gerade, dass es komplizierter ist, als ich mir vorgestellt habe.
     
  6. ukulele

    ukulele Datenbank-Guru

    Du kannst so gut wie alles mit dynamischem SQL machen, es wird halt schnell unübersichtlich und komplex. Mein Code war nur ein Beispiel, du kannst natürlich auch:
    Code:
    DECLARE    @willSpalte VARCHAR(10),
            @query VARCHAR(8000)
    
    SET        @willSpalte = 'F2'
    SET        @query = 'SELECT * FROM `tabelle` WHERE ' + @willSpalte + ' = 1'
    EXEC(@query)
    SET        @query = 'SELECT * FROM `tabelle` WHERE ' + @willSpalte + ' = 2'
    EXEC(@query)
    oder
    Code:
    DECLARE    @willSpalte VARCHAR(10),
            @query1 VARCHAR(8000),
            @query2 VARCHAR(8000)
    
    SET        @willSpalte = 'F2'
    SET        @query1 = 'SELECT * FROM `tabelle` WHERE ' + @willSpalte + ' = 1'
    SET        @query2 = 'SELECT * FROM `tabelle` WHERE ' + @willSpalte + ' = 2'
    EXEC(@query1)
    EXEC(@query2)
    oder
    Code:
    DECLARE    @willSpalte VARCHAR(10),
            @query VARCHAR(8000),
            @a INT,
            @b INT
    
    SET        @willSpalte = 'F2'
    SET        @a = 1
    SET        @b = 3
    
    WHILE    @a <= @b
    BEGIN
        SET        @query = 'SELECT * FROM `tabelle` WHERE ' + @willSpalte + ' = ' + @a
        EXEC(@query)
        SET        @a = @a + 1
    END
    machen.

    In einem Statement direkt kannst du Variablen nicht als Tabellen- oder Spaltennamen verwenden.
     
  7. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Schade eigentlich :rolleyes:
    Das sieht aber eigentlich sehr gut aus:

    Nur bekomme ich ab dieser Zeile
    Code:
    DECLARE @willSpalte VARCHAR(10),
    schon eine Fehlermeldung, die ich nicht richtig interpretieren kann.
    Code:
    Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting '(' in
    
     
  8. ukulele

    ukulele Datenbank-Guru

    Vermutlich musst du
    Code:
    DECLARE @var1 INT;
    DECLARE @var2 INT;
    machen und kannst nicht
    Code:
    DECLARE @var1 INT, @var2 INT;
    nutzen. Wie gesagt mein MSSQL ist nicht identisch zu MySQL, da gibt es schon Syntaxunterschiede.
     
  9. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Egal, wie ich es mache bekomme ich die gleiche Fehlermeldung

    Fragt sich wie das in MySql aussieht...
     
  10. ukulele

    ukulele Datenbank-Guru

    Wenn du keine Variable in MySQL deklariert bekommst machst du wohl was grundlegendes falsch. Arbeitest du wirklich mit einem MySQL Client?
     
  11. Distrilec

    Distrilec Datenbank-Guru

    2 Sekunden bei google...
    http://stackoverflow.com/questions/1009954/mysql-variable-vs-variable-whats-the-difference
    Die Antwort auf die Frage erklärt Variablen mMn ziemlich gut....
     
  12. BerndB

    BerndB Datenbank-Guru

    Hi zusammen,

    natürlich kann man mit einen kleinen Trick Tabellen / Spaltennamen als Variable an eine Stored Procedure übergeben.

    Ich bin mir nur nicht sicher was du da machen willst.

    außerhalb einer Procedure geht das so (o. Tabellen/Spaltennamen)

    SET @x=1;
    SELECT * from tabelle where spalte = @x;

    zum prüfen der Variable einfach

    select @x;

    Poste mal den komplettes Query / Stored Procedure dann schau ich mal.

    Das schaff ich aber erst heute Abend.

    Gruss

    Bernd
     
  13. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    ich arbeite mit phpmyadmin und mysql_select_db

    Hallo,

    Wenn das außerhalb einer Procedure geht, ist mir das sehr viel lieber, weil es weniger Code ist.

    Mein Code (aufs wesentliche reduziert) sieht so aus:
    $link_db = mysql_connect(...);
    mysql_select_db('...');
    SET @a = `TABLE 9`;
    $sql = 'SELECT * FROM @a';
    $ergebnis = mysql_query($sql);
    $row = mysql_fetch_row($ergebnis);
    echo $row[2];

    Eigentlich sollte bei diesem Code die erste Zeile, dritte Spalte der `TABLE 9` ausgegeben werden.

    Ich bekomme:
    Code:
    Parse error: syntax error, unexpected '@' in[...]on line 3
     
  14. Distrilec

    Distrilec Datenbank-Guru

    Eine Sache die ich dir jetzt direkt schreiben will... Man sollte dir vorn Kopp schlagen...
    Bitte lass mich mit deinem fertigen Produkt arbeiten, innerhalb von einer Minute lösch ich dir die komplette Datenbank :) (SQL Injection)

    Davon abgesehen:

    der Teil kann nicht funktionieren.... Leerzeichen sind im Tabellennamen nicht erlaubt:
    Das "@a" ist in diesem Fall auch keine Variable sondern nur String... du musst den Variablen Wert anhängen... -> 'Select * From ' + @a + ';' oder so ähnlich
     
  15. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Doch, durch die Backticks.

    Code:
    $sql = 'SELECT * FROM `TABLE 9`;
    funktioniert jedenfalls

    Dann war Variable der falsche Ausdruck, sondern ein String, den ich in allen Abfragen verwenden will, ohne ihn auszuschreiben.
    Wie funktioniert denn dieser Fall?
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden