Wie initialisiere ich ein variable in einem SELECT

Wie initialisiere ich ein variable in einem SELECT

am 17.04.2007 14:57:43 von Stephan Menzel

Hallo,

ich habe eine Tabelle mit einem Datum, und Frage dies nun mit
SELECT Datum FROM t; ab!
Nun wollte ich, das mir in der gleichen Zeile das vorhergehende Datum
des vorhergehenden Datensatzes mit Angegeben wird und ich dachte
ich könnte es so machen:
SELECT @vDatum, @vDatum:=Datum FROM t;
was so aber nicht geht, da die Variable @vDatum nicht initialisiert in
der SELECT abfrage steht. denn Wenn ich diese Abfrage mit einer SP
mache und zuvor schreibe SET @vDatum='2000-01-01';
und anschliesend SELECT @vDatum, @vDatum:=Datum FROM t Ausführe
geht es so wie ich mir das Vorstellte!

Gibt es eine Möglichkeit in einem SELECT eine Variable so einzubinden,
das die Abfrage auch ohne SP möglich ist?

cu Stephan.

cu Stephan

Re: Wie initialisiere ich ein variable in einem SELECT

am 17.04.2007 15:13:56 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Wie initialisiere ich ein variable in einem SELECT

am 17.04.2007 15:27:31 von Stephan Menzel

Hallo,


>begin Stephan Menzel schrieb:
>> Hallo,
>>
>> ich habe eine Tabelle mit einem Datum, und Frage dies nun mit
>> SELECT Datum FROM t; ab!
>
>ohne ORDER BY ist die Reihenfolge zufällig ...
das ist klar aber mir ging es ja ertmal um die übergabe vom Vorgänger
zum Nachfolger!

>
>
>> Nun wollte ich, das mir in der gleichen Zeile das vorhergehende Datum
>
>... in einer zufälligen Menge gibt es keinen Vorgänger.
>
>
>> Gibt es eine Möglichkeit in einem SELECT eine Variable so einzubinden,
>> das die Abfrage auch ohne SP möglich ist?
>
>Nein. SQL kennt keine Variablen. Mag sein, daß SQL2003 mit seinen
>windowing-Funktionen hier Möglichkeiten bieten wird. Bis dahin: SP.
jetzt ist habe ich noch folgende Idee gehabt die anscheinend so weit
auch geht!

SELECT @vDatum, @vDatum:=Datum FROM t, (SELECT @vDatum:='2000-01-01')
ORDER BY Datum

ist an so einer Abfrage was zu bemängeln, ich dacht das es gehen kann,
da ja subselect's eher ausgeführt werden!?

cu stephan

cu Stephan

Re: Wie initialisiere ich ein variable in einem SELECT

am 17.04.2007 16:38:16 von Axel Schwenke

Stephan Menzel wrote:

> SELECT @vDatum, @vDatum:=Datum FROM t;
> was so aber nicht geht, da die Variable @vDatum nicht initialisiert in
> der SELECT abfrage steht.

Warum soll das nicht gehen? Der Wert einer nichtinitialisierten
Variable ist einfach NULL.

> Wenn ich diese Abfrage mit einer SP
> mache und zuvor schreibe SET @vDatum='2000-01-01';
> und anschliesend SELECT @vDatum, @vDatum:=Datum FROM t Ausführe
> geht es so wie ich mir das Vorstellte!
>
> Gibt es eine Möglichkeit in einem SELECT eine Variable so einzubinden,
> das die Abfrage auch ohne SP möglich ist?

K.A. ob du zufällig @vDatum als Variablennamen gewählt hast, denn
tatsächlich kennt MySQL User-Variablen, die auch außerhalb einer SP
existieren können (User-Variablen haben Session-Scope). Der Name
einer User-Variablen beginnt mit einem '@' Zeichen:

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

Du kannst also schreiben:
mysql> SET @vDatum='2000-01-01';
mysql> SELECT @vDatum, @vDatum:=Datum FROM t;


XL

Re: Wie initialisiere ich ein variable in einem SELECT

am 17.04.2007 18:14:20 von Stephan Menzel

>Stephan Menzel wrote:
>
>> SELECT @vDatum, @vDatum:=Datum FROM t;
>> was so aber nicht geht, da die Variable @vDatum nicht initialisiert in
>> der SELECT abfrage steht.
>
>Warum soll das nicht gehen? Der Wert einer nichtinitialisierten
>Variable ist einfach NULL.
>
>> Wenn ich diese Abfrage mit einer SP
>> mache und zuvor schreibe SET @vDatum='2000-01-01';
>> und anschliesend SELECT @vDatum, @vDatum:=Datum FROM t Ausführe
>> geht es so wie ich mir das Vorstellte!
>>
>> Gibt es eine Möglichkeit in einem SELECT eine Variable so einzubinden,
>> das die Abfrage auch ohne SP möglich ist?
>
>K.A. ob du zufällig @vDatum als Variablennamen gewählt hast, denn
>tatsächlich kennt MySQL User-Variablen, die auch außerhalb einer SP
>existieren können (User-Variablen haben Session-Scope). Der Name
>einer User-Variablen beginnt mit einem '@' Zeichen:
>
>http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
>
>Du kannst also schreiben:
>mysql> SET @vDatum='2000-01-01';
>mysql> SELECT @vDatum, @vDatum:=Datum FROM t;
>
ja das ist richtig, aber ich habe als frontend Access und da fällt mir
nicht so recht etwas ein eine Variable vorher zu definieren!

cu stephan

cu Stephan

Re: Wie initialisiere ich ein variable in einem SELECT

am 19.04.2007 15:15:24 von Stephan Menzel

On Tue, 17 Apr 2007 15:27:31 +0200, Stephan Menzel
wrote:

>Hallo,
>

>
>ist an so einer Abfrage was zu bemängeln, ich dacht das es gehen kann,
>da ja subselect's eher ausgeführt werden!?
>
>cu stephan

Kann jemand zu meiner Lösung mal noch ein Urteil bitte mit abgeben, ob
man das so machen kann?


cu Stephan

Re: Wie initialisiere ich ein variable in einem SELECT

am 20.04.2007 07:45:57 von Thomas Rachel

Stephan Menzel wrote:


>>SELECT @vDatum, @vDatum:=Datum FROM t, (SELECT @vDatum:='2000-01-01')
>>ORDER BY Datum
>>ist an so einer Abfrage was zu bemängeln, ich dacht das es gehen kann,
>>da ja subselect's eher ausgeführt werden!?
>>
>>cu stephan
>
> Kann jemand zu meiner Lösung mal noch ein Urteil bitte mit abgeben, ob
> man das so machen kann?

Sollte eigentlich gehen, ist aber IMHO unschön - Du meinst zwar, jetzt zu
wissen, daß nur Kalenderdaten ab 2000 möglich sind - aber evtl. kommt
später einer auf die Idee, alte Daten nachtragen zu müssen, und dann
knallts.

Was spricht dagegen, daß der erste zurückgelieferte Datensatz ein
Startdatum von NULL hat? Das kann man ja immer noch separat behandeln.

Oder aber so was wie

SELECT COALESCE(@vDatum,'n/a'), @vDatum:=Datum FROM t ORDER BY Datum


HTH,

Thomas
--
Es klopft an der Tür. Kevin geht hin:
- Wer ist daaa?
- Ich.
- Iiich?

Re: Wie initialisiere ich ein variable in einem SELECT

am 20.04.2007 08:51:05 von Stephan Menzel

>Stephan Menzel wrote:
>
>
>>>SELECT @vDatum, @vDatum:=Datum FROM t, (SELECT @vDatum:='2000-01-01')
>>>ORDER BY Datum
>>>ist an so einer Abfrage was zu bemängeln, ich dacht das es gehen kann,
>>>da ja subselect's eher ausgeführt werden!?
>>>
>>>cu stephan
>>
>> Kann jemand zu meiner Lösung mal noch ein Urteil bitte mit abgeben, ob
>> man das so machen kann?
>
>Sollte eigentlich gehen, ist aber IMHO unschön - Du meinst zwar, jetzt zu
>wissen, daß nur Kalenderdaten ab 2000 möglich sind - aber evtl. kommt
>später einer auf die Idee, alte Daten nachtragen zu müssen, und dann
>knallts.
>
>Was spricht dagegen, daß der erste zurückgelieferte Datensatz ein
>Startdatum von NULL hat? Das kann man ja immer noch separat behandeln.
>
>Oder aber so was wie
>
>SELECT COALESCE(@vDatum,'n/a'), @vDatum:=Datum FROM t ORDER BY Datum

Weil diese abfrage nicht Funktioniert da ja @vDatum nicht erzeugt ist
und somit die erste Spalte immer 'n/a' sein würde!

>
>
>HTH,
>
>Thomas

cu Stephan

Re: Wie initialisiere ich ein variable in einem SELECT

am 20.04.2007 12:03:53 von Axel Schwenke

Stephan Menzel wrote:
>>
>>Sollte eigentlich gehen, ist aber IMHO unschön - Du meinst zwar, jetzt zu
>>wissen, daß nur Kalenderdaten ab 2000 möglich sind - aber evtl. kommt
>>später einer auf die Idee, alte Daten nachtragen zu müssen, und dann
>>knallts.
>>
>>Was spricht dagegen, daß der erste zurückgelieferte Datensatz ein
>>Startdatum von NULL hat? Das kann man ja immer noch separat behandeln.
>>
>>Oder aber so was wie
>>
>>SELECT COALESCE(@vDatum,'n/a'), @vDatum:=Datum FROM t ORDER BY Datum
>
> Weil diese abfrage nicht Funktioniert da ja @vDatum nicht erzeugt ist
> und somit die erste Spalte immer 'n/a' sein würde!

Das ist Blödsinn! Die Variable ist NULL nur für die erste Zeile deines
Resultsets. Und in der Tat ist NULL der einzig sinnvolle Rückgabewert.
Irgendwelche "magischen" Werte a'la 2000-01-01 sind *nicht* sinvoll!


XL

Re: Wie initialisiere ich ein variable in einem SELECT

am 20.04.2007 12:12:56 von Joachim Durchholz

Thomas Rachel schrieb:
> Was spricht dagegen, daß der erste zurückgelieferte Datensatz ein
> Startdatum von NULL hat? Das kann man ja immer noch separat behandeln.

Ich erinnere mich vage, dass mysql einen Datumswert von NULL als
ungültig behandelt und in '0000-00-00' konvertiert.
D.h. gleicher Ansatz, anderer Nullwert.

Grüße
Jo

Re: Wie initialisiere ich ein variable in einem SELECT

am 20.04.2007 13:24:50 von Andreas Sakowski

"Axel Schwenke" schrieb
[...]
>>>SELECT COALESCE(@vDatum,'n/a'), @vDatum:=Datum FROM t ORDER BY
>>>Datum
>>
>> Weil diese abfrage nicht Funktioniert da ja @vDatum nicht erzeugt
>> ist
>> und somit die erste Spalte immer 'n/a' sein würde!
>
> Das ist Blödsinn! Die Variable ist NULL nur für die erste Zeile
> deines
> Resultsets. Und in der Tat ist NULL der einzig sinnvolle
> Rückgabewert.
> Irgendwelche "magischen" Werte a'la 2000-01-01 sind *nicht* sinvoll!

Das kann ich nicht bestätigen. Bei mir ist bei der ersten Abfrage der
Wert der
Variablen immer NULL. Wenn ich hingegen die Abfrage ein zweites mal
absetze,
so wird der Variablen der Wert zugewiesen. Der erste Wert ist dann der
letzte
angezeigte Wert der vorherigen Abfrage.

mysql> select version() ;
+---------------------+
| version() |
+---------------------+
| 5.0.38-Debian_2-log |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT COALESCE(@vDatum,'n/a'), @vDatum:=datum FROM a ORDER BY
datum ;
+-------------------------+----------------+
| COALESCE(@vDatum,'n/a') | @vDatum:=datum |
+-------------------------+----------------+
| n/a | 2007-01-01 |
| n/a | 2007-01-02 |
| n/a | 2007-01-03 |
+-------------------------+----------------+
3 rows in set (0.00 sec)

mysql> SELECT COALESCE(@vDatum,'n/a'), @vDatum:=datum FROM a ORDER BY
datum ;
+-------------------------+----------------+
| COALESCE(@vDatum,'n/a') | @vDatum:=datum |
+-------------------------+----------------+
| 2007-01-03 | 2007-01-01 |
| 2007-01-01 | 2007-01-02 |
| 2007-01-02 | 2007-01-03 |
+-------------------------+----------------+
3 rows in set (0.00 sec)

Andreas

Re: Wie initialisiere ich ein variable in einem SELECT

am 20.04.2007 13:40:48 von Stephan Menzel

>"Axel Schwenke" schrieb
>[...]
>>>>SELECT COALESCE(@vDatum,'n/a'), @vDatum:=Datum FROM t ORDER BY
>>>>Datum
>>>
>>> Weil diese abfrage nicht Funktioniert da ja @vDatum nicht erzeugt
>>> ist
>>> und somit die erste Spalte immer 'n/a' sein würde!
>>
>> Das ist Blödsinn! Die Variable ist NULL nur für die erste Zeile
>> deines
>> Resultsets. Und in der Tat ist NULL der einzig sinnvolle
>> Rückgabewert.
>> Irgendwelche "magischen" Werte a'la 2000-01-01 sind *nicht* sinvoll!
>
>Das kann ich nicht bestätigen. Bei mir ist bei der ersten Abfrage der
>Wert der
>Variablen immer NULL. Wenn ich hingegen die Abfrage ein zweites mal
>absetze,
>so wird der Variablen der Wert zugewiesen. Der erste Wert ist dann der
>letzte
>angezeigte Wert der vorherigen Abfrage.
>
>mysql> select version() ;
>+---------------------+
>| version() |
>+---------------------+
>| 5.0.38-Debian_2-log |
>+---------------------+
>1 row in set (0.00 sec)
>
>mysql> SELECT COALESCE(@vDatum,'n/a'), @vDatum:=datum FROM a ORDER BY
>datum ;
>+-------------------------+----------------+
>| COALESCE(@vDatum,'n/a') | @vDatum:=datum |
>+-------------------------+----------------+
>| n/a | 2007-01-01 |
>| n/a | 2007-01-02 |
>| n/a | 2007-01-03 |
>+-------------------------+----------------+
>3 rows in set (0.00 sec)
>
>mysql> SELECT COALESCE(@vDatum,'n/a'), @vDatum:=datum FROM a ORDER BY
>datum ;
>+-------------------------+----------------+
>| COALESCE(@vDatum,'n/a') | @vDatum:=datum |
>+-------------------------+----------------+
>| 2007-01-03 | 2007-01-01 |
>| 2007-01-01 | 2007-01-02 |
>| 2007-01-02 | 2007-01-03 |
>+-------------------------+----------------+
>3 rows in set (0.00 sec)

Deshalb habe ich das ja dann so:

SELECT @vDatum, @vDatum:=Datum FROM t, (SELECT @vDatum:='2000-01-01')
AS s ORDER BY Datum

gemacht!

Das ich das mit (SELECT @vDatum:='2000-01-01') machte ist nur das da
was drin steht es geht auch '0000-01-01'! der erste wert ist egal,
wobei wenn er null sein könnte das ganze schöner wäre, nur dummer
Weise geht eine SELECT Abfrage mit Variable nicht, wenn sie nicht
vorher erstellt wurde!


cu Stephan

Re: Wie initialisiere ich ein variable in einem SELECT

am 20.04.2007 13:51:16 von Stephan Menzel

>Stephan Menzel wrote:
>>>
>>>Sollte eigentlich gehen, ist aber IMHO unschön - Du meinst zwar, jetzt zu
>>>wissen, daß nur Kalenderdaten ab 2000 möglich sind - aber evtl. kommt
>>>später einer auf die Idee, alte Daten nachtragen zu müssen, und dann
>>>knallts.
>>>
>>>Was spricht dagegen, daß der erste zurückgelieferte Datensatz ein
>>>Startdatum von NULL hat? Das kann man ja immer noch separat behandeln.
>>>
>>>Oder aber so was wie
>>>
>>>SELECT COALESCE(@vDatum,'n/a'), @vDatum:=Datum FROM t ORDER BY Datum
>>
>> Weil diese abfrage nicht Funktioniert da ja @vDatum nicht erzeugt ist
>> und somit die erste Spalte immer 'n/a' sein würde!
>
>Das ist Blödsinn! Die Variable ist NULL nur für die erste Zeile deines
Ich habe es mit der MySQL version 5.0.37 versucht und das geht nicht!
Falls es mit deiner version geht, würde ich gern die Nummer wissen,
ansonsten würde ich sagen Du hast es nicht einmal probiert, das SELECT
auszuführen, dann zu schreiben das es Blödsinn ist, finde ich etwas
üertrieben! Ich stelle die Fragen doch weil nach dem was rein nach der
Überlegung zu erwarten wäre eben nicht als Ergebniss auftritt!

denn
mysql> SELECT @vDatum, @vDatum:=datum FROM a ORDER BY
datum ;

ist eben:
+-------------------------+----------------+
| @vDatum | @vDatum:=datum |
+-------------------------+----------------+
| null | 2007-01-01 |
| null | 2007-01-02 |
| null | 2007-01-03 |
+-------------------------+----------------+

wenn zuvor @vDatum noch nicht verwendet wurde!

>Resultsets. Und in der Tat ist NULL der einzig sinnvolle Rückgabewert.
>Irgendwelche "magischen" Werte a'la 2000-01-01 sind *nicht* sinvoll!
>
>
>XL

cu Stephan

Re: Wie initialisiere ich ein variable in einem SELECT

am 20.04.2007 15:08:01 von Axel Schwenke

"Andreas Sakowski" wrote:
> "Axel Schwenke" schrieb
> [...]
>>>>SELECT COALESCE(@vDatum,'n/a'), @vDatum:=Datum FROM t ORDER BY
>>>>Datum
>>>
>>> Weil diese abfrage nicht Funktioniert da ja @vDatum nicht erzeugt
>>> ist
>>> und somit die erste Spalte immer 'n/a' sein würde!
>>
>> Das ist Blödsinn! Die Variable ist NULL nur für die erste Zeile
>> deines
>> Resultsets. Und in der Tat ist NULL der einzig sinnvolle
>> Rückgabewert.
>> Irgendwelche "magischen" Werte a'la 2000-01-01 sind *nicht* sinvoll!
>
> Das kann ich nicht bestätigen. Bei mir ist bei der ersten Abfrage der
> Wert der
> Variablen immer NULL. Wenn ich hingegen die Abfrage ein zweites mal
> absetze,
> so wird der Variablen der Wert zugewiesen. Der erste Wert ist dann der
> letzte
> angezeigte Wert der vorherigen Abfrage.

Stimmt. Ich nehme alles zurück und behaupte das Gegenteil!
In der Tat hatte ich auch so getestet:

mysql> select @foo, @foo:=now();
+------+---------------------+
| @foo | @foo:=now() |
+------+---------------------+
| NULL | 2007-04-20 15:05:34 |
+------+---------------------+

mysql> select @foo, @foo:=now();
+---------------------+---------------------+
| @foo | @foo:=now() |
+---------------------+---------------------+
| 2007-04-20 15:05:34 | 2007-04-20 15:05:36 |
+---------------------+---------------------+


aber:

mysql> create table t1 (c1 int);

mysql> insert into t1 values (1), (2), (3);

mysql> select @a, @a:=c1 from t1;
+------+--------+
| @a | @a:=c1 |
+------+--------+
| NULL | 1 |
| NULL | 2 |
| NULL | 3 |
+------+--------+

mysql> SET @a=NULL;

mysql> select @a, @a:=c1 from t1;
+------+--------+
| @a | @a:=c1 |
+------+--------+
| NULL | 1 |
| 1 | 2 |
| 2 | 3 |
+------+--------+


offensichtlich muß die Variable schon existieren, damit sie auch
"zwischen den Zeilen" einen neuen Wert bekommt.


XL