English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 威盾新闻 >> 从多个SQL语句到一个 SQL表达式

 

从多个SQL语句到一个 SQL表达式

威盾防火墙 2015-03-06

 

跟其他编程语言一样,SQL语言提供了两类条件构造:过程型(IF和CASE语句)和函数型(CASE表达式)。在大多数环境中,可使用任何一种构造来表达计算,到底使用哪一种只是喜好问题。但是,使用CASE表达式编写的逻辑不但比使用CASE或IF语句编写的逻辑更紧凑,而且更有效。

请考虑下面的SQL PL 代码片段:

  1. IF (Price <= MaxPrice) THEN 
  2.   INSERT INTO tab_comp(Id, Val) VALUES(Oid, Price);  
  3. ELSE 
  4.   INSERT INTO tab_comp(Id, Val) VALUES(Oid, MaxPrice);  
  5. END IF; 

IF子句中的条件仅用于决定将什么值插入 tab_comp.Val 列中。为了避免过程层和数据流层之间的上下文切换,可利用CASE表达式将相同的逻辑表示成一个 INSERT语句:

  1. INSERT INTO tab_comp(Id, Val)  
  2.        VALUES(Oid,  
  3.               CASE 
  4.                  WHEN (Price <= MaxPrice) THEN Price  
  5.                  ELSE MaxPrice  
  6.               END); 

值得注意的是,CASE表达式可在任何希望有标量值的上下文中使用。特别地,可在赋值符号的右边使用它们。例如:

  1. IF (Name IS NOT NULLTHEN 
  2.   SET ProdName = Name;  
  3. ELSEIF (NameStr IS NOT NULLTHEN 
  4.   SET ProdName = NameStr;  
  5. ELSE 
  6.   SET ProdName = DefaultName;  
  7. END IF; 

可以改写成:

  1. SET ProdName = (CASE 
  2.                   WHEN (Name IS NOT NULLTHEN Name 
  3.                   WHEN (NameStr IS NOT NULLTHEN NameStr  
  4.                   ELSE  DefaultName  
  5.                 END); 

实际上,这个特殊的示例有一个更好的解决方案:

  1. SET ProdName = COALESCE(Name, NameStr, DefaultName);

相关内容: 最新内容:
将SQL 2000日志迁移到SQL Server 2008[2015-03-06]
SQL的数据操纵语句[2015-03-06]
SQL/PLUS学习笔记之SQL Buffer[2015-03-06]
SQL Server 数据库中管理常用的SQL与T-SQL[2015-03-06]
PL/SQL开发中动态SQL的使用方法[2015-03-06]
速学如何定义SQL存储过程[2015-03-06]
将SQL 2000日志迁移到SQL Server 2008[2015-03-06]
SQL的数据操纵语句[2015-03-06]
SQL/PLUS学习笔记之SQL Buffer[2015-03-06]
SQL Server 数据库中管理常用的SQL与T-SQL[2015-03-06]
PL/SQL开发中动态SQL的使用方法[2015-03-06]
速学如何定义SQL存储过程[2015-03-06]