Kasus dalam Select Statement


141

Saya memiliki pernyataan SQL yang memiliki CASEdari SELECTdan saya tidak bisa memperbaikinya. Bisakah kalian tunjukkan saya contoh di CASEmana kasus adalah kondisi dan hasilnya dari kasus. Sebagai contoh:

     Select xxx, yyy
     case : desc case when bbb then 'blackberry';
     when sss then 'samsung';
     end 
     from (select ???? .....

tempat hasilnya ditampilkan

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry

Jawaban saya menjelaskan dua jenis kasus 1. Ekspresi KASUS sederhana 2. Ekspresi KASUS yang dicari. Dan penggunaan kedua jenis case dalam SELECT, UPDATE, With ORDER BY, With HAVING queries.
Somnath Muluk

Jawaban:


195

MSDN adalah referensi yang bagus untuk jenis pertanyaan ini mengenai sintaks dan penggunaan. Ini dari halaman Transact SQL Reference - CASE.

http://msdn.microsoft.com/en-us/library/ms181765.aspx

USE AdventureWorks2012;
GO
SELECT   ProductNumber, Name, "Price Range" = 
  CASE 
     WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
     WHEN ListPrice < 50 THEN 'Under $50'
     WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
     WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
     ELSE 'Over $1000'
  END
FROM Production.Product
ORDER BY ProductNumber ;
GO

Situs bagus lain yang mungkin ingin Anda periksa jika Anda menggunakan SQL Server adalah SQL Server Central . Ini memiliki beragam sumber daya yang tersedia untuk area SQL Server apa pun yang ingin Anda pelajari.


82

Saya pikir ini bisa membantu Anda.

Menggunakan SELECTpernyataan dengan CASEekspresi sederhana

Dalam sebuah SELECTpernyataan, CASEekspresi sederhana hanya memungkinkan pemeriksaan kesetaraan; tidak ada perbandingan yang dibuat. Contoh berikut menggunakan CASEekspresi untuk mengubah tampilan kategori lini produk agar lebih dimengerti.

USE AdventureWorks2012;
GO
SELECT   ProductNumber, Category =
      CASE ProductLine
         WHEN 'R' THEN 'Road'
         WHEN 'M' THEN 'Mountain'
         WHEN 'T' THEN 'Touring'
         WHEN 'S' THEN 'Other sale items'
         ELSE 'Not for sale'
      END,
   Name
FROM Production.Product
ORDER BY ProductNumber;
GO

Menggunakan SELECTpernyataan dengan CASEekspresi yang dicari

Di dalam SELECTpernyataan, CASEekspresi yang dicari memungkinkan nilai diganti di set hasil berdasarkan pada nilai perbandingan. Contoh berikut menampilkan harga daftar sebagai komentar teks berdasarkan kisaran harga untuk suatu produk.

USE AdventureWorks2012;
GO
SELECT   ProductNumber, Name, "Price Range" = 
      CASE 
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
         WHEN ListPrice < 50 THEN 'Under $50'
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
         ELSE 'Over $1000'
      END
FROM Production.Product
ORDER BY ProductNumber ;
GO

Menggunakan CASEdalam ORDER BYklausa

Contoh-contoh berikut menggunakan CASEekspresi dalam ORDER BYklausa untuk menentukan urutan pengurutan baris berdasarkan nilai kolom yang diberikan. Dalam contoh pertama, nilai di kolom SalariedFlag dari tabel HumanResources.Employee dievaluasi. Karyawan yang memiliki SalariedFlag set ke 1 dikembalikan secara berurutan oleh BusinessEntityID dengan urutan menurun. Karyawan yang memiliki SalariedFlag diatur ke 0 dikembalikan secara berurutan oleh BusinessEntityID dalam urutan menaik. Pada contoh kedua, set hasil diurutkan oleh kolom TerritoryName ketika kolom CountryRegionName sama dengan 'Amerika Serikat' dan oleh CountryRegionName untuk semua baris lainnya.

SELECT BusinessEntityID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
GO


SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName
         ELSE CountryRegionName END;

Menggunakan CASEdalam sebuah UPDATEpernyataan

Contoh berikut menggunakan CASEekspresi dalam UPDATEpernyataan untuk menentukan nilai yang ditetapkan untuk kolom VacationHours untuk karyawan dengan SalariedFlag yang ditetapkan ke 0. Ketika mengurangkan 10 jam dari VacationHours menghasilkan nilai negatif, VacationHours meningkat 40 jam; jika tidak, VacationHours bertambah 20 jam. The OUTPUTklausa digunakan untuk menampilkan sebelum dan sesudah nilai liburan.

USE AdventureWorks2012;
GO
UPDATE HumanResources.Employee
SET VacationHours = 
    ( CASE
         WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
         ELSE (VacationHours + 20.00)
       END
    )
OUTPUT Deleted.BusinessEntityID, Deleted.VacationHours AS BeforeValue, 
       Inserted.VacationHours AS AfterValue
WHERE SalariedFlag = 0; 

Menggunakan CASEdalam HAVINGklausa

Contoh berikut menggunakan CASEekspresi dalam HAVINGklausa untuk membatasi baris yang dikembalikan oleh SELECTpernyataan. Pernyataan ini mengembalikan tarif per jam maksimum untuk setiap jabatan di tabel HumanResources.Employee. The HAVINGklausul membatasi judul untuk orang-orang yang dipegang oleh laki-laki dengan besar tingkat gaji maksimum dari 40 dolar atau wanita dengan lebih besar tingkat gaji maksimum dari 42 dolar.

USE AdventureWorks2012;
GO
SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate
FROM HumanResources.Employee AS e
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID
GROUP BY JobTitle
HAVING (MAX(CASE WHEN Gender = 'M' 
        THEN ph1.Rate 
        ELSE NULL END) > 40.00
     OR MAX(CASE WHEN Gender  = 'F' 
        THEN ph1.Rate  
        ELSE NULL END) > 42.00)
ORDER BY MaximumRate DESC;

Untuk keterangan lebih lanjut tentang contoh ini, kunjungi sumbernya .

Kunjungi juga di sini dan di sini untuk beberapa contoh dengan detail luar biasa.


Sangat menghargai jawaban yang begitu mendetail.
Aneeq Azam Khan

12

Anda juga bisa menggunakan:

SELECT CASE
         WHEN upper(t.name) like 'P%' THEN
          'productive'
         WHEN upper(t.name) like 'T%' THEN
          'test'
         WHEN upper(t.name) like 'D%' THEN
          'development'
         ELSE
          'unknown'
       END as type
FROM table t
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.