Im Select auf Variablen zugreifen

alexfrenzel92

SQL-Guru
Beiträge
122
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
 
Werbung:
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...
 
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...

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[...]
 
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.
 
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.

Und wie sähe es bei drei Abfragen aus?

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

... 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.
 
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.
 
In einem Statement direkt kannst du Variablen nicht als Tabellen- oder Spaltennamen verwenden.

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

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)

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
 
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.
 
Wenn du keine Variable in MySQL deklariert bekommst machst du wohl was grundlegendes falsch. Arbeitest du wirklich mit einem MySQL Client?
 
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....
MySQL has the concept of user-defined variables.

They are loosely typed variables that may be initialized somewhere in a session and keep their value until the session ends.

They are prepended with an @ sign, like this: @var

You can initialize this variable with a SET statement or inside in a query:

SET@var =1

SELECT@var2 :=2
When you develop a stored procedure in MySQL, you can pass the input parameters and declare the local variables:

DELIMITER //

CREATEPROCEDURE prc_test (var INT)BEGINDECLARE var2 INT;SET var2 =1;SELECT var2;END;//

DELIMITER ;
These variables are not prepended with any prefixes.

The difference between a procedure variable and a session-specific user-defined variable is that procedure variable is reinitialized to NULL each time the procedure is called, while the session-specific variable is not:

CREATEPROCEDURE prc_test ()BEGINDECLARE var2 INT DEFAULT1;SET var2 := var2 +1;SET@var2 :=@var2 +1;SELECT var2,@var2;END;

SET@var2 =1;

CALL prc_test();

var2 @var2
--- ---22


CALL prc_test();

var2 @var2
--- ---23


CALL prc_test();

var2 @var2
--- ---24
As you can see, var2 (procedure variable) is reinitialized each time the procedure is called, while @var2 (session-specific variable) is not.

(In addition to user-defined variables, MySQL also has some predefined "system variables", which may be "global variables" such as @@global.port or "session variables" such as @@session.sql_mode; these "session variables" are unrelated to session-specific user-defined variables.)
 
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
 
Wenn du keine Variable in MySQL deklariert bekommst machst du wohl was grundlegendes falsch. Arbeitest du wirklich mit einem MySQL Client?
ich arbeite mit phpmyadmin und mysql_select_db

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
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
 
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:
SET @a = `TABLE 9`;
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
$sql = 'SELECT * FROM @a';
 
Werbung:
Davon abgesehen:

der Teil kann nicht funktionieren.... Leerzeichen sind im Tabellennamen nicht erlaubt
Doch, durch die Backticks.

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

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
Dann war Variable der falsche Ausdruck, sondern ein String, den ich in allen Abfragen verwenden will, ohne ihn auszuschreiben.
Wie funktioniert denn dieser Fall?
 
Zurück
Oben