sql >> Database >  >> RDS >> Sqlserver

SQL CASE-instructie

SQL CASE-instructie is zeer krachtig en veelzijdig. Het kan worden gebruikt in de SELECT-, UPDATE- en INSERT-instructies. Zelfs het kan worden gebruikt in ORDER BY- en GROUP BY-clausules. Laten we ze een voor een bekijken.

Syntaxis

Bekijk eerst de syntaxis van de CASE-instructie:

CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2

...
WHEN conditionN THEN resultN
ELSE result
END;

Gegevensvoorbereiding

Kies eerst uw voorkeursdatabase en voer onderstaande query's uit om een ​​tabel "Personen" te maken en deze met gegevens te vullen.

IF OBJECT_ID('Persons', 'U') IS NOT NULL
DROP TABLE Persons;
GO

CREATE TABLE Persons(
name varchar(20)
,age int
,sex varchar(2)
)

GO

INSERT INTO Persons (name,age,sex) values('Bob',5, 'M');
INSERT INTO Persons (name,age,sex) values('Harry',15, 'M');
INSERT INTO Persons (name,age,sex) values('Jasmine',25, 'F');
INSERT INTO Persons (name,age,sex) values('Fanny',65, 'F');
INSERT INTO Persons (name,age,sex) values('Evan',-1, 'N');

GO

SELECT-instructie

Laten we het gebruiken in onze SELECT-instructie.

SELECT Name, age as 'Actual Age',
CASE
WHEN age >= 0 AND age <= 12 THEN 'CHILD'
WHEN age >= 13 AND age <= 19 THEN 'TEEN AGE'
WHEN age >= 20 AND age <= 40 THEN 'YOUNG'
WHEN age >= 41 AND age <= 60 THEN 'MIDDLE AGE'
WHEN age >= 61 THEN 'OLD'
ELSE 'NOT DEFINED' END as 'New Age using CASE Stmt',
sex as 'Actual Gender',
CASE
WHEN sex = 'M' THEN 'MALE'
WHEN sex = 'F' THEN 'FEMALE'
WHEN sex = 'N' THEN 'DONT WANT TO DISCLOSE'
END as  'New Gender  using CASE Stmt'
FROM Persons

Uitvoer

INSERT-instructie

DECLARE @age INT
DECLARE @sex VARCHAR(10)

SET @age = 40
SET @sex = 'MALE'
INSERT INTO Persons (Name, Age, Sex)
VALUES(
'Jack',
CASE WHEN @age < 0 THEN -1 ELSE @age END,
CASE WHEN @sex = 'MALE' THEN 'M'
WHEN @sex = 'FEMALE' THEN 'F'
ELSE 'N' END
)

Uitvoer

Als we onze eerste SELECT-instructie opnieuw uitvoeren, zou de uitvoer zijn:

UPDATE-verklaring

DECLARE @age INT
SET @age = -4

UPDATE Persons SET
age = CASE WHEN @age < 0 THEN -1 ELSE @age END
WHERE Name = 'Bob'

Uitvoer

Als we de bovenstaande SELECT-instructie opnieuw uitvoeren, zou de uitvoer zijn:

BESTEL PER clausule

CASE can be added in ORDER BY clause in above SELECT statement
SELECT Name, age as 'Actual Age',
CASE
WHEN age >= 0 AND age <= 12 THEN 'CHILD'
WHEN age >= 13 AND age <= 19 THEN 'TEEN AGE'
WHEN age >= 20 AND age <= 40 THEN 'YOUNG'
WHEN age >= 41 AND age <= 60 THEN 'MIDDLE AGE'
WHEN age >= 61 THEN 'OLD'
ELSE 'NOT DEFINED' END as 'New Age using CASE Stmt',
sex as 'Actual Gender',
CASE
WHEN sex = 'M' THEN 'MALE'
WHEN sex = 'F' THEN 'FEMALE'
WHEN sex = 'N' THEN 'DONT WANT TO DISCLOSE'
END as  'New Gender  using CASE Stmt'
FROM Persons
ORDER BY
CASE WHEN sex='M' THEN age END,
CASE WHEN sex='F' THEN Name END

Uitvoer

GROEP OP clausule

Nu is het tijd om CASE te onderzoeken in de GROUP BY-clausule in onze eerste SELECT-instructie:

SELECT
CASE
WHEN age <= 40 THEN 'YOUNG'
WHEN age >= 41 THEN 'OLD'
END as 'New Age using CASE Stmt', COUNT(*)
FROM Persons
GROUP BY CASE
WHEN age <= 40 THEN 'YOUNG'
WHEN age >= 41 THEN 'OLD'
END

Uitvoer

We hebben alle gevallen van ons CASE-onderwerp van vandaag behandeld.

Blijf thuis! Blijf veilig!

Het werd voor het eerst gepubliceerd op mijn blog.


  1. Meer geavanceerde functies toevoegen, zoals het beheren van categorieën en stemmen op discussielijnen en berichten

  2. MyBatis RowBounds beperkt de resultaten van zoekopdrachten niet

  3. Hoe het percentage van twee kolommen in MySQL te berekenen

  4. Gegevensmaskering in DB-toepassingen