2010-10-21 3 views
15

Ich möchte wissen, ob es eine Möglichkeit ist, eine benutzerdefinierte Variable in WHERE Klausel zu verwenden, wie in diesem Beispiel:MySQL benutzerdefinierte Variable in WHERE-Klausel

SELECT id, location, @id := 10 FROM songs WHERE id = @id 

Diese Abfrage läuft ohne Fehler aber funktioniert nicht wie erwartet.

+0

Was erwarten Sie von der Abfrage? –

+0

Im realen Szenario möchte ich eine Variable definieren, um LOCATE() Offset eines Teilstrings in einem Feld zu erhalten. Ich benutze es oft in der SELECT-Anweisung. Das Problem ist, dass ich nur Ergebnisse anzeigen möchte, die diesen Offset größer als Null haben. Ich weiß, dass ich eine andere LOCATE() in WHERE-Klausel verwenden kann, aber warum funktioniert diese Variable nicht in der WHERE-Klausel? –

Antwort

16

Nicht weit von dem, was Mike E. vorgeschlagen, aber eine Erklärung:

SELECT id, location FROM songs, (SELECT @id := 10) AS var WHERE id = @id; 

ich ähnliche Abfragen verwendet, um Fensterfunktionen in MySQL zu emulieren. Z.B. Row sampling - nur ein Beispiel von Variablen in derselben Anweisung

+0

Unterabfrage in der FROM-Klausel ... was für ein nützlicher Trick! Vielen Dank! :) –

3

Sicher, aber ich habe noch nie jemanden gesehen, der versucht, eine Variable zu setzen und sie in der gleichen Aussage zu verwenden, wie Sie sind. Versuchen:

SET @id := 10; 
SELECT @id := 10 FROM songs WHERE id = @id; 

oder

SELECT @id := 10 FROM songs; 
SELECT @id := 10 FROM songs WHERE id = @id; 

Ich habe beide benutzt, und sie scheinen beide für mich zu arbeiten.

+0

das scheint nicht zu funktionieren ...!? – Raffael

10

Aus der MySQL-Handbuch Seite auf User Defined Variables mit:

Als allgemeine Regel gilt, sollten Sie niemals einen Wert einen Benutzervariablen zuweisen und lesen Sie den Wert innerhalb die gleiche Aussage. Sie erhalten möglicherweise die Ergebnisse, die Sie erwarten, aber dies ist nicht garantiert.

So sollten Sie die Zuordnung von der select-Anweisung trennen:

SET @id = 10; 
SELECT id, location, @id FROM songs WHERE id = @id; 
0

Dieser arbeitete für mich!

SET @identifier = 7; 
SELECT * FROM test where identifier = @identifier; 
Verwandte Themen