Isu Pembahagian dalam PostgreSQL: Mengapa Bahagian (/) Mengembalikan Keputusan Salah
Apabila cuba mengira bahagian dengan lajur integer dalam PostgreSQL, pengguna boleh menemui hasil yang tidak dijangka. Pertimbangkan senario berikut:
Masalah:
Jadual bernama "perisian" mengandungi lajur "dev_cost" dan "sell_cost". Anda ingin menentukan kuantiti perisian yang perlu dijual untuk memulihkan dev_cost. Memandangkan "dev_cost" ialah 16000 dan "sell_cost" ialah 7500, anda menjangkakan hasilnya ialah 3. Walau bagaimanapun, pertanyaan
select dev_cost / sell_cost from software;
mengembalikan 2 sebaliknya.
Sebab:
PostgresSQL melaksanakan pembahagian integer, yang memotong keputusan ke arah sifar. Oleh kerana kedua-dua "dev_cost" dan "sell_cost" ditakrifkan sebagai integer, hasilnya dipotong kepada 2.
Penyelesaian:
Untuk mendapatkan hasil yang betul, sekurang-kurangnya satu operan mesti dibuang ke jenis titik terapung, seperti apungan atau perpuluhan. Ini boleh dicapai menggunakan fungsi cast() atau dua titik bertindih :: operator:
select cast(dev_cost as decimal) / sell_cost from software;
atau
select dev_cost::decimal / sell_cost from software;
Sebagai alternatif, anda boleh membulatkan hasil kepada integer terdekat menggunakan siling() fungsi:
select ceil(dev_cost::decimal / sell_cost) from software;
Demo:
[SQLFiddle demo](https://www.sqlfiddle.com/#!17/23da8/1)
Atas ialah kandungan terperinci Mengapa Bahagian Integer PostgreSQL Mengembalikan Keputusan yang Salah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!