Kasus SQL Saat tidak memberi label null
Saya mencoba melakukan Masalah Kode Leet ini :
Tulis kueri SQL untuk mendapatkan gaji tertinggi kedua dari tabel Karyawan.
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
Misalnya, dalam tabel Karyawan di atas, kueri harus mengembalikan 200 sebagai gaji tertinggi kedua. Jika tidak ada gaji tertinggi kedua, kueri harus mengembalikan nol.
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
Saya mencoba memberikan solusi ini:
SELECT
CASE WHEN Salary = ''
THEN NULL
ELSE Salary END SecondHighestSalary
FROM
Employee
ORDER BY
SecondHighestSalary
LIMIT 1,1;
Ketika ada gaji kedua, itu berfungsi dengan baik dan mengembalikan hasilnya. Namun, jika tidak ada gaji kedua dan hanya ada satu gaji, hanya string kosong yang dikembalikan. Saya mencoba mengembalikan NULL, namun, tidak kembali NULLseperti yang saya tulis dalam kueri saya. Bagaimana cara memperbaikinya?
Jawaban
CASEEkspresi Anda menguji gaji di setiap baris tabel, bukan yang dipilih oleh LIMITklausa. Pengurutan dilakukan setelah menghasilkan nilai dalam SELECTdaftar, karena Anda dapat mengurutkan berdasarkan nilai yang dihitung tersebut.
Karena tidak ada gaji yang merupakan string kosong, kondisi di Anda CASEtidak akan pernah benar, jadi selalu mengembalikan Salarynilainya. Hasilnya, kueri Anda setara dengan
SELECT Salary AS SecondHighestSalary
FROM Employee
ORDER BY SecondHighestSalary
LIMIT 1, 1
Hal-hal lain:
- Anda perlu memanfaatkan
DESCuntuk mendapatkan gaji tertinggi di awal. Jadi, meskipun metode Anda berhasil, ia akan menemukan gaji terendah kedua . - Metode Anda tidak menangani kasus di mana banyak karyawan terikat untuk gaji tertinggi.
LIMIT 1, 1akan mengembalikan baris kedua, yang akan menjadi salah satu karyawan yang terikat.
Anda dapat menyelesaikan masalah kedua menggunakan subkueri yang menghapus duplikat:
SELECT DISTINCT Salary
FROM Employee
Jadi pertanyaan terakhir bisa jadi:
SELECT IF(COUNT(*) > 0, MAX(Salary), NULL) AS SecondHighestSalary
FROM (
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1, 1
) AS x
Misalnya
select max(salary) salary
from employee
where salary not in
(select max(salary) from employee)
Anda dapat menggunakan solusi ini, di mana jika tidak ada gaji tertinggi kedua akan mengembalikan NULL. Jika tidak, akan mengembalikan gaji tertinggi kedua
SELECT
IFNULL(MIN(Salary) , 'NULL') as SecondHighestSalary
FROM
Employee
WHERE salary > (SELECT MIN(salary)
FROM Employee)
Atau jika Anda ingin DB default null maka hapus saja kondisi IFNULL
SELECT
MIN(Salary) as SecondHighestSalary
FROM
Employee
WHERE salary > (SELECT MIN(salary)
FROM Employee)