跟其他编程语言一样,SQL语言提供了两类条件构造:过程型(IF和CASE语句)和函数型(CASE表达式)。在大多数环境中,可使用任何一种构造来表达计算,到底使用哪一种只是喜好问题。但是,使用CASE表达式编写的逻辑不但比使用CASE或IF语句编写的逻辑更紧凑,而且更有效。
请考虑下面的SQL PL 代码片段:
- IF (Price <= MaxPrice) THEN
- INSERT INTO tab_comp(Id, Val) VALUES(Oid, Price);
- ELSE
- INSERT INTO tab_comp(Id, Val) VALUES(Oid, MaxPrice);
- END IF;
IF子句中的条件仅用于决定将什么值插入 tab_comp.Val 列中。为了避免过程层和数据流层之间的上下文切换,可利用CASE表达式将相同的逻辑表示成一个 INSERT语句:
- INSERT INTO tab_comp(Id, Val)
- VALUES(Oid,
- CASE
- WHEN (Price <= MaxPrice) THEN Price
- ELSE MaxPrice
- END);
值得注意的是,CASE表达式可在任何希望有标量值的上下文中使用。特别地,可在赋值符号的右边使用它们。例如:
- IF (Name IS NOT NULL) THEN
- SET ProdName = Name;
- ELSEIF (NameStr IS NOT NULL) THEN
- SET ProdName = NameStr;
- ELSE
- SET ProdName = DefaultName;
- END IF;
可以改写成:
- SET ProdName = (CASE
- WHEN (Name IS NOT NULL) THEN Name
- WHEN (NameStr IS NOT NULL) THEN NameStr
- ELSE DefaultName
- END);
实际上,这个特殊的示例有一个更好的解决方案:
- SET ProdName = COALESCE(Name, NameStr, DefaultName);
|