Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Menggunakan 'kolom ekspresi kasus' di mana klausa

Alasan kesalahan ini adalah bahwa SQL SELECT pernyataan secara logis * diproses dalam urutan berikut:

  • FROM :pemilihan satu tabel atau banyak yang BERGABUNG dan semua kombinasi baris yang cocok dengan ON kondisi.

  • WHERE :kondisi dievaluasi dan baris yang tidak cocok dihapus.

  • GROUP BY :baris dikelompokkan (dan setiap grup diciutkan menjadi satu baris)

  • HAVING :kondisi dievaluasi dan baris yang tidak cocok dihapus.

  • SELECT :daftar kolom dievaluasi.

  • DISTINCT :baris duplikat dihapus (jika pernyataan SELECT DISTINCT)

  • UNION , EXCEPT , INTERSECT :tindakan operan itu diambil pada baris pernyataan sub-SELECT. Misalnya, jika itu UNION, semua baris dikumpulkan (dan duplikat dihilangkan kecuali UNION ALL) setelah semua pernyataan sub-SELECT dievaluasi. Sesuai untuk kasus KECUALI atau INTERSECT.

  • ORDER BY :baris diurutkan.

Oleh karena itu, Anda tidak dapat menggunakan di WHERE klausa, sesuatu yang belum diisi atau dihitung. Lihat juga pertanyaan ini:Oracle-sql-clause-evaluation-order

Perhatikan bahwa mesin basis data mungkin juga memilih urutan evaluasi lain untuk kueri (dan itulah yang biasanya mereka lakukan!) Satu-satunya batasan adalah hasilnya harus sama seperti jika urutan di atas digunakan .

Solusinya adalah melampirkan kueri di kueri lain :

SELECT *
FROM
  ( SELECT ename
         , job
         , CASE deptno
             WHEN 10 THEN 'ACCOUNTS'
             WHEN 20 THEN 'SALES'
                     ELSE 'UNKNOWN'
           END AS department
    FROM emp
  ) tmp
WHERE department = 'SALES' ;

atau untuk menggandakan perhitungan dalam kondisi WHERE :

SELECT ename
     , job
     , CASE deptno
         WHEN 10 THEN 'ACCOUNTS'
         WHEN 20 THEN 'SALES'
                 ELSE 'UNKNOWN'
       END AS department
FROM emp
WHERE
    CASE deptno
      WHEN 10 THEN 'ACCOUNTS'
      WHEN 20 THEN 'SALES'
              ELSE 'UNKNOWN'
    END = 'SALES' ;

Saya rasa ini adalah versi sederhana dari kueri Anda atau Anda dapat menggunakan:

SELECT ename
     , job
     , 'SALES' AS department
FROM emp
WHERE deptno = 20 ;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Refresh / Memperbarui layar formulir di Oracle D2k Forms 6i

  2. Kesalahan SQL:ORA-02291:batasan integritas

  3. Apa sebenarnya yang dilakukan tanda kutip di sekitar nama tabel?

  4. Cara Mengubah Tabel di Oracle

  5. Tautkan Kembali Infrastruktur Jaringan