Rumah > Soal Jawab > teks badan
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?
P粉7606754522023-10-25 09:10:31
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 < 10
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 kepada
HAVING
子句来过滤返回的行。 (注意:HAVING
子句在结果集准备好之后进行计算;与 WHERE
Sebagai pilihan, anda boleh mengembalikan ungkapan dalam senarai SELECT dan kemudian menggunakan klausa
Pilihan lain ialah menggunakan paparan sebaris untuk menyediakan set hasil, dan kemudian pertanyaan luar boleh menggunakan klausa WHERE pada ungkapan yang dikembalikan.
@var
以外的表达式应用谓词;他们实际上并没有对 @var
Tetapi secara tegasnya, kaedah ini semuanya menggunakan predikat pada ungkapan selain
P粉5305192342023-10-25 00:42:47
Anda perlu menetapkan alias dan mengujinya dalam klausa HAVING
:
SELECT id, @var := id * 2 AS id_times_2 FROM user HAVING id_times_2 < 10
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:
SELECT id, id * 2 AS id_times_2 FROM user HAVING id_times_2 < 10