Trường hợp chọn câu lệnh


141

Tôi có một câu lệnh SQL có CASEtừ SELECTvà tôi không thể hiểu đúng. Các bạn có thể chỉ cho tôi một ví dụ về CASEtrường hợp các trường hợp là điều kiện và kết quả là từ các trường hợp. Ví dụ:

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

nơi kết quả cho thấy

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry

Câu trả lời của tôi giải thích hai loại trường hợp 1. Biểu thức CASE đơn giản 2. Biểu thức CASE được tìm kiếm. Và cả hai cách sử dụng trường hợp trong CHỌN, CẬP NHẬT, với ĐẶT HÀNG B, NG, với các truy vấn HAVING.
Somnath Muluk

Câu trả lời:


195

MSDN là một tài liệu tham khảo tốt cho các loại câu hỏi liên quan đến cú pháp và cách sử dụng. Đây là từ trang Transact SQL Reference - CASE.

http://msdn.microsoft.com/en-us/l 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

Một trang web tốt khác mà bạn có thể muốn kiểm tra nếu bạn đang sử dụng SQL Server là SQL Server Central . Điều này có nhiều nguồn tài nguyên có sẵn cho bất kỳ khu vực nào của SQL Server mà bạn muốn tìm hiểu.


82

Tôi nghĩ rằng những điều này có thể hữu ích cho bạn.

Sử dụng một SELECTcâu lệnh với một CASEbiểu thức đơn giản

Trong một SELECTtuyên bố, một CASEbiểu thức đơn giản chỉ cho phép kiểm tra đẳng thức; không có so sánh khác được thực hiện. Ví dụ sau sử dụng CASEbiểu thức để thay đổi hiển thị các danh mục dòng sản phẩm để làm cho chúng dễ hiểu hơn.

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

Sử dụng một SELECTtuyên bố với một CASEbiểu thức tìm kiếm

Trong một SELECTcâu lệnh, CASEbiểu thức tìm kiếm cho phép thay thế các giá trị trong tập kết quả dựa trên các giá trị so sánh. Ví dụ sau hiển thị giá niêm yết dưới dạng nhận xét văn bản dựa trên phạm vi giá cho sản phẩm.

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

Sử dụng CASEtrong một ORDER BYmệnh đề

Các ví dụ sau sử dụng CASEbiểu thức trong ORDER BYmệnh đề để xác định thứ tự sắp xếp của các hàng dựa trên giá trị cột đã cho. Trong ví dụ đầu tiên, giá trị trong cột SalariedFlag của bảng HumanResource.Employee được ước tính. Các nhân viên có SalariedFlag được đặt thành 1 được BusinessEntityID trả về theo thứ tự giảm dần. Các nhân viên có SalariedFlag được đặt thành 0 được BusinessEntityID trả về theo thứ tự tăng dần. Trong ví dụ thứ hai, tập kết quả được sắp xếp theo cột Lãnh thổ khi cột CountryRegionName bằng 'Hoa Kỳ' và bởi CountryRegionName cho tất cả các hàng khác.

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;

Sử dụng CASEtrong một UPDATEtuyên bố

Ví dụ sau sử dụng CASEbiểu thức trong một UPDATEcâu lệnh để xác định giá trị được đặt cho cột VacationHours cho nhân viên với SalariedFlag được đặt thành 0. Khi trừ 10 giờ từ VacationHours dẫn đến giá trị âm, VacationHours tăng thêm 40 giờ; mặt khác, VacationHours được tăng thêm 20 giờ. Các OUTPUTkhoản được sử dụng để hiển thị trước và sau khi giá trị kỳ nghỉ.

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; 

Sử dụng CASEtrong một HAVINGmệnh đề

Ví dụ sau sử dụng CASEbiểu thức trong HAVINGmệnh đề để hạn chế các hàng được trả về bởi SELECTcâu lệnh. Câu lệnh trả về tỷ lệ tối đa hàng giờ cho mỗi chức danh công việc trong bảng HumanResource.Employee. Điều HAVINGkhoản này giới hạn các chức danh đối với những người được giữ bởi nam giới có mức chi trả tối đa lớn hơn 40 đô la hoặc phụ nữ có tỷ lệ chi trả tối đa lớn hơn 42 đô la.

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;

Để biết thêm chi tiết mô tả về các ví dụ này truy cập vào nguồn .

Cũng truy cập ở đâyở đây cho một số ví dụ với các chi tiết tuyệt vời.


Thực sự đánh giá cao một câu trả lời chi tiết.
Aneeq Azam Khan

12

bạn cũng có thể dùng:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.