Kasus SQL Saat tidak memberi label null

Oct 04 2020

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

3 Barmar Oct 04 2020 at 07:11

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:

  1. Anda perlu memanfaatkan DESCuntuk mendapatkan gaji tertinggi di awal. Jadi, meskipun metode Anda berhasil, ia akan menemukan gaji terendah kedua .
  2. 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
Strawberry Oct 04 2020 at 06:11

Misalnya

 select max(salary) salary 
   from employee 
 where salary not in 
 (select max(salary) from employee)
Runa Oct 04 2020 at 06:45

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)