กรณีในเลือกคำชี้แจง


141

ฉันมีคำสั่ง SQL ที่มีCASEจากSELECTและฉันไม่สามารถทำให้ถูกต้องได้ พวกคุณช่วยแสดงให้ฉันเห็นตัวอย่างของCASEกรณีและปัญหาได้อย่างไรและผลลัพธ์มาจากคดีความ ตัวอย่างเช่น:

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

ตำแหน่งที่แสดงผลลัพธ์

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry

คำตอบของฉันอธิบายสองประเภทเคส 1. นิพจน์ CASE แบบง่าย 2. นิพจน์ CASE ที่ค้นหา และการใช้งานตัวพิมพ์ทั้งสองแบบใน SELECT, UPDATE, พร้อม ORDER BY และแบบสอบถามที่มี
Somnath Muluk

คำตอบ:


195

MSDN เป็นข้อมูลอ้างอิงที่ดีสำหรับคำถามประเภทนี้เกี่ยวกับไวยากรณ์และการใช้งาน นี่คือจากการอ้างอิง Transact SQL หน้า - กรณี

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

เว็บไซต์ที่ดีที่คุณอาจต้องการที่จะตรวจสอบว่าคุณกำลังใช้ SQL Server เป็นSQL Server กลาง สิ่งนี้มีแหล่งข้อมูลมากมายสำหรับ SQL Server ที่คุณต้องการเรียนรู้


82

ฉันคิดว่าสิ่งเหล่านี้อาจเป็นประโยชน์สำหรับคุณ

การใช้SELECTคำสั่งที่มีการCASEแสดงออกอย่างง่าย

ภายในSELECTคำสั่งการCASEแสดงออกอย่างง่ายช่วยให้การตรวจสอบความเท่าเทียมเพียง; ไม่มีการเปรียบเทียบอื่น ๆ ตัวอย่างต่อไปนี้ใช้CASEนิพจน์เพื่อเปลี่ยนการแสดงหมวดหมู่สายผลิตภัณฑ์เพื่อให้เข้าใจได้ง่ายขึ้น

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

การใช้SELECTคำสั่งที่มีการCASEแสดงออกค้นหา

ภายในSELECTคำสั่งCASEนิพจน์ที่ค้นหาอนุญาตให้แทนที่ค่าในชุดผลลัพธ์ตามค่าการเปรียบเทียบ ตัวอย่างต่อไปนี้แสดงราคาปลีกเป็นความคิดเห็นข้อความตามช่วงราคาสำหรับผลิตภัณฑ์

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

ใช้CASEในORDER BYข้อ

ตัวอย่างต่อไปนี้ใช้CASEนิพจน์ในORDER BYข้อเพื่อกำหนดลำดับการเรียงของแถวตามค่าคอลัมน์ที่กำหนด ในตัวอย่างแรกค่าในคอลัมน์ SalariedFlag ของตาราง HumanResources.Employee จะถูกประเมิน พนักงานที่มีการตั้งค่า SalariedFlag เป็น 1 จะถูกส่งคืนตามลำดับโดย BusinessEntityID ตามลำดับจากมากไปน้อย พนักงานที่มีการตั้งค่า SalariedFlag เป็น 0 จะถูกส่งคืนตามลำดับโดย BusinessEntityID ในลำดับจากน้อยไปหามาก ในตัวอย่างที่สองชุดผลลัพธ์ถูกเรียงลำดับโดยคอลัมน์ TerritoryName เมื่อคอลัมน์ CountryRegionName เท่ากับ 'United States' และตาม CountryRegionName สำหรับแถวอื่น ๆ ทั้งหมด

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;

ใช้CASEในUPDATEงบ

ตัวอย่างต่อไปนี้ใช้CASEนิพจน์ในUPDATEคำสั่งเพื่อกำหนดค่าที่กำหนดไว้สำหรับคอลัมน์ VacationHours สำหรับพนักงานที่มี SalariedFlag ตั้งค่าเป็น 0 เมื่อลบ 10 ชั่วโมงจากผลลัพธ์ของ VacationHours ด้วยค่าลบ VacationHours จะเพิ่มขึ้น 40 ชั่วโมง มิฉะนั้นวันหยุดจะเพิ่มขึ้น 20 ชั่วโมง OUTPUTประโยคที่ใช้ในการแสดงก่อนและหลังวันหยุดค่า

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; 

ใช้CASEในHAVINGข้อ

ตัวอย่างต่อไปนี้ใช้CASEนิพจน์ในHAVINGข้อเพื่อ จำกัด แถวที่ส่งคืนโดยSELECTคำสั่ง คำสั่งส่งคืนอัตรารายชั่วโมงสูงสุดสำหรับแต่ละตำแหน่งงานในตาราง HumanResources.Employee HAVINGข้อ จำกัด ชื่อให้กับผู้ที่จะมีขึ้นโดยคนที่มีมากขึ้นอัตราค่าจ้างสูงสุดกว่า 40 ดอลลาร์หรือผู้หญิงที่มีมากขึ้นอัตราค่าจ้างสูงสุดกว่า 42 ดอลลาร์

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;

สำหรับคำอธิบายรายละเอียดเพิ่มเติมของตัวอย่างเหล่านี้แวะไปที่แหล่งที่มา

เยี่ยมชมที่นี่และที่นี่เพื่อดูตัวอย่างพร้อมรายละเอียดที่ดีเยี่ยม


ขอขอบคุณคำตอบโดยละเอียด
Aneeq Azam Khan

12

คุณยังสามารถใช้:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.