SQL 條件語句 (IF, CASE WHEN, IFNULL)
1、IF
1.1 表達式:
IF( expr1 , expr2 , expr3 )
expr1條件,條件為true,則值是expr2 ,false,值就是expr3
示例;
SELECT
o.id,u.account,catagory.`name`,orderTime,detail.amount,periodtime,if(direction='0','看漲','看跌') directionName
FROM t_order_detail detail
LEFT JOIN t_order o ON o.id = detail.orderId
LEFT JOIN t_catagory catagory ON catagory.id = o.catId
LEFT JOIN t_user u ON u.id = o.userId
1.2 IF ELSE 做為流程控制語句使用
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]
參數說明:
Boolean_expression
返回True或False的表達式。如果布爾表達式包含SELECT語句,則SELECT語句必須用括號括起來
{ sql_statement | statement_block }
使用語句塊定義的任何有效的Transact-SQL語句或語句分組。要定義語句塊(批處理),請使用流語言關鍵字BEGIN和END 組合。盡管所有Transact-SQL語句在BEGIN…END塊中都是有效的,但某些Transact-SQL語句不應在同一批(語句塊)中組合在一起。
示例1:
IF DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday')
SELECT 'Weekend';
ELSE
SELECT 'Weekday';
注意:IF作為一條語句,在END IF后需要加上分號“;”以表示語句結束,其他語句如CASE、LOOP等也是相同的。
示例2:
USE AdventureWorks2012;
GO
DECLARE @AvgWeight decimal(8,2), @BikeCount int
IF
(SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
BEGIN
SET @BikeCount =
(SELECT COUNT(*)
FROM Production.Product
WHERE Name LIKE 'Touring-3000%');
SET @AvgWeight =
(SELECT AVG(Weight)
FROM Production.Product
WHERE Name LIKE 'Touring-3000%');
PRINT 'There are ' + CAST(@BikeCount AS varchar(3)) + ' Touring-3000 bikes.'
PRINT 'The average weight of the top 5 Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.';
END
ELSE
BEGIN
SET @AvgWeight =
(SELECT AVG(Weight)
FROM Production.Product
WHERE Name LIKE 'Touring-3000%' );
PRINT 'Average weight of the Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.' ;
END ;
GO
2、CASE WHEN
- CASE表達式有兩種格式:兩種格式都支持可選的ELSE參數。
- 簡單大小寫表達式將一個表達式與一組簡單表達式進行比較以確定結果。
- 搜索的CASE表達式計算一組布爾表達式以確定結果。
- CASE可用於允許有效表達式的任何語句或子句中。例如,可以在SELECT、UPDATE、DELETE和SET等語句中使用CASE,也可以在SELECT\U list、in、WHERE、ORDER BY和HAVING等子句中使用CASE。
表達式:
CASE 列名
WHEN 條件 THEN 結果
ELSE 其他結果
END 別名
示例:
SELECT
CASE detail.`status` WHEN '0' THEN '未開倉'
WHEN '1' THEN '已開倉'
WHEN '2' THEN '已平倉'
ELSE '取消訂單' END
status,
CASE o.type WHEN '0' THEN '單期'
WHEN '1' THEN '多期'
ELSE '策略' END
typeName
FROM t_order_detail detail
LEFT JOIN t_order o ON o.id = detail.orderId
示例:
SELECT CASE sva
WHEN 1 THEN '男'
ELSE '女'
END AS s
FROM table_name
WHERE sva != '';
官方示例1(SELECT):
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
官方示例2:
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
官方示例3:
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;
官方示例4:
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;
官方示例5:
USE AdventureWorks2012;
GO
CREATE FUNCTION dbo.GetContactInformation(@BusinessEntityID int)
RETURNS @retContactInformation TABLE
(
BusinessEntityID int NOT NULL,
FirstName nvarchar(50) NULL,
LastName nvarchar(50) NULL,
ContactType nvarchar(50) NULL,
PRIMARY KEY CLUSTERED (BusinessEntityID ASC)
)
AS
-- Returns the first name, last name and contact type for the specified contact.
BEGIN
DECLARE
@FirstName nvarchar(50),
@LastName nvarchar(50),
@ContactType nvarchar(50);
-- Get common contact information
SELECT
@BusinessEntityID = BusinessEntityID,
@FirstName = FirstName,
@LastName = LastName
FROM Person.Person
WHERE BusinessEntityID = @BusinessEntityID;
SET @ContactType =
CASE
-- Check for employee
WHEN EXISTS(SELECT * FROM HumanResources.Employee AS e
WHERE e.BusinessEntityID = @BusinessEntityID)
THEN 'Employee'
-- Check for vendor
WHEN EXISTS(SELECT * FROM Person.BusinessEntityContact AS bec
WHERE bec.BusinessEntityID = @BusinessEntityID)
THEN 'Vendor'
-- Check for store
WHEN EXISTS(SELECT * FROM Purchasing.Vendor AS v
WHERE v.BusinessEntityID = @BusinessEntityID)
THEN 'Store Contact'
-- Check for individual consumer
WHEN EXISTS(SELECT * FROM Sales.Customer AS c
WHERE c.PersonID = @BusinessEntityID)
THEN 'Consumer'
END;
-- Return the information to the caller
IF @BusinessEntityID IS NOT NULL
BEGIN
INSERT @retContactInformation
SELECT @BusinessEntityID, @FirstName, @LastName, @ContactType;
END;
RETURN;
END;
GO
SELECT BusinessEntityID, FirstName, LastName, ContactType
FROM dbo.GetContactInformation(2200);
GO
SELECT BusinessEntityID, FirstName, LastName, ContactType
FROM dbo.GetContactInformation(5);
官方示例6:
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;
官方示例7:
-- Uses AdventureWorks
SELECT ProductAlternateKey, 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,
EnglishProductName
FROM dbo.DimProduct
ORDER BY ProductKey;
官方示例8:
-- Uses AdventureWorks
UPDATE dbo.DimEmployee
SET VacationHours =
( CASE
WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
ELSE (VacationHours + 20.00)
END
)
WHERE SalariedFlag = 0;
3、ISNULL()、NVL()、IFNULL()、 NULLIF
3.1 表達式(MySQL):
IFNULL( expr1 , expr2)
expr1 值不為 NULL 返回 expr1,否則返回 expr2 例如:
IFNULL(AA,0); --AA不為NULL則返回AA,否則返回 0
3.2 -- MsSQL的 ISNULL 功能一樣
3.3 -- Oracle的 NVL 功能一樣
3.4 表達式(MsSQL): NULLIF 不一樣
NULLIF ( expression , expression )
如果兩個表達式不相等,則返回第一個表達式。如果表達式相等,則NULLIF返回第一個表達式類型的null值。
創建時間:2020.09.14 更新時間: