Rumah >pangkalan data >tutorial mysql >Mengapa Menggunakan Pembolehubah dalam Pernyataan SELECT SQL Tunggal Selalunya Mengembalikan Keputusan yang Tidak Dijangka?
Mengisytiharkan dan Menggunakan Pembolehubah Dalam Pernyataan SELECT
Dalam SQL, memberikan nilai kepada pembolehubah dan mendapatkan semula nilai itu dalam pertanyaan yang sama boleh menjadi mencabar. Pertimbangkan contoh berikut:
SELECT @z:=SUM(item), 2*@z FROM TableA;
Pertanyaan ini cuba mengira jumlah lajur "item" dan menyimpannya dalam pembolehubah bernama "@z". Ia kemudian mendarabkan nilai "@z" dengan 2. Walau bagaimanapun, yang menghairankan, lajur kedua sentiasa mengembalikan NULL.
Ini berlaku kerana dokumentasi MySQL secara eksplisit menyatakan bahawa memberikan nilai kepada pembolehubah pengguna dan membacanya dalam kenyataan yang sama tidak boleh dipercayai. Susunan penilaian ungkapan sedemikian tidak ditentukan dan tertakluk kepada perubahan dalam keluaran akan datang.
Untuk menggambarkan ini dengan lebih lanjut, pertimbangkan pertanyaan alternatif:
SELECT @z:=someProcedure(item), 2*@z FROM TableA;
Dalam pertanyaan ini, "@z" ialah memberikan nilai melalui panggilan prosedur. Dalam senario ini, pertanyaan berfungsi seperti yang diharapkan kerana panggilan prosedur dinilai secara berasingan daripada penugasan pembolehubah.
Untuk mengatasi pengehadan dengan pembolehubah pengguna, anda boleh menggunakan subkueri untuk menetapkan nilai dan mendapatkannya dalam bahagian utama pertanyaan:
select @z, @z*2 from (SELECT @z:=sum(item) FROM TableA ) t;
Dalam subkueri ini, nilai "@z" diberikan menggunakan SELECT. Pertanyaan utama kemudian memilih "@z" dan melakukan pengiraan yang diperlukan.
Atas ialah kandungan terperinci Mengapa Menggunakan Pembolehubah dalam Pernyataan SELECT SQL Tunggal Selalunya Mengembalikan Keputusan yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!