Dalam MySQL, bolehkah pembolehubah sementara digunakan dalam WHERE
klausa?
Sebagai contoh, dalam pertanyaan berikut:
SELECT `id`, @var := `id` * 2 FROM `user`
@var telah berjaya ditetapkan kepada dua kali ganda nilai `id`
Namun, jika saya cuba menapis set hasil untuk hanya memasukkan hasil dengan @var kurang daripada 10:
SELECT `id`, @var := `id` * 2 FROM `user` WHERE @var < 10
Kemudian saya tidak mendapat apa-apa keputusan.
Bagaimana untuk menapis hasil berdasarkan nilai @var?
S: Bolehkah pembolehubah sementara MySQL digunakan dalam klausa WHERE?
Ya. Pembolehubah takrif pengguna MySQL (seperti
@var
) boleh dirujuk dalam klausa WHERE.Pembolehubah yang ditakrifkan pengguna ialah rujukan kepada apa-apa nilai yang pada masa ini diberikan kepadanya apabila ungkapan itu dinilai.
Dalam pertanyaan, predikat dalam klausa WHERE dinilai sebelum ungkapan dalam senarai SELECT.
Iaitu, apabila satu baris diakses,
@var
akan dinilai sebagai ungkapan Boolean; untuk setiap baris calon, ungkapan itu dinilai dan baris dikembalikan hanya jika hasilnya BENAR.Jika anda memberikan pembolehubah ini nilai yang lebih besar daripada atau sama dengan 10, semua baris akan dikembalikan sebelum melaksanakan pernyataan.
S: Bagaimana untuk menapis keputusan berdasarkan nilai
@var
?Anda benar-benar tidak boleh. (Malah, itulah yang dilakukan oleh pertanyaan asal anda.)
Anda boleh memasukkan predikat dalam ungkapan selain daripada
.@var
之外的其他表达式中包含谓词;这些表达式可以从分配给@var
; ungkapan ini boleh diperoleh daripada nilai yang diberikan kepadaHAVING
子句来过滤返回的行。 (注意:HAVING
子句在结果集准备好之后进行计算;与WHERE
Sebagai pilihan, anda boleh mengembalikan ungkapan dalam senarai SELECT dan kemudian menggunakan klausa@var
以外的表达式应用谓词;他们实际上并没有对@var
Tetapi secara tegasnya, kaedah ini semuanya menggunakan predikat pada ungkapan selainAnda perlu menetapkan alias dan mengujinya dalam klausa
HAVING
:Perhatikan bahawa jika anda hanya menggunakan formula untuk menapis, dan bukannya menghantar hasil dalaman dari satu baris ke baris seterusnya, anda tidak memerlukan pembolehubah ini sama sekali. Anda boleh menulis: