Rumah >pangkalan data >tutorial mysql >Mengapa Menggunakan Pembolehubah dalam Pernyataan SELECT SQL Tunggal Selalunya Mengembalikan Keputusan yang Tidak Dijangka?

Mengapa Menggunakan Pembolehubah dalam Pernyataan SELECT SQL Tunggal Selalunya Mengembalikan Keputusan yang Tidak Dijangka?

DDD
DDDasal
2024-12-20 22:29:13340semak imbas

Why Does Using Variables in a Single SQL SELECT Statement Often Return Unexpected Results?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn