sqlserver避免sql脚本中出现除零错误的方法分享,除零操作

摘自:

利用nullif函数

01-基本的查询语句

摘要:
下文介绍sql server中,sql脚本避免出现除零错误的方法分享

nullif函数有两个参数,定义如下:

A:一些命令


NULLIF( expression , expression )

  1. sqlplus sys/sys@192.168.22.220:1521/orcl as
    sysdba;
  2. conn scott/123456@192.168.22.210:1521/orcl;
    从当前用户转换成scott用户
  3. show user; 显示当前用户名
  4. show linesize; 显示的行宽
  5. set linesize 150; 设置行宽
  6. col ename for a8; col sal for 9999;设置列ename为字符长度为8个长度;设置列sal为4位数字;
  7. c 命令字符替换,如: c /form/from 或者c!form!from
  8. host cls;清屏幕
  9. spool d:/1.sql 将命令写入到1.sql文件中。spool off终止写入文件中。

在各种业务系统开发中,通常会遇到除零的错误,下文分享了两种处理方法:
方法1: case when end 

其作用就是:如果两个指定的表达式相等,就返回null值。

B:sql优化原则

declare @a int ---分子
declare @b int ---分母
select  case  when @b=0 then NULL else @a/@b end  as [a除以b]

看一示例:

  1. 查询的时候尽量使用列名;如:select ename,sal from emp; 
  2. 分组查询没有多行函数(聚合函数),如果使用过滤,考虑使用where还是having
  3. 在子查询和多表查询之间选择,尽量使用多表查询
  4. 在集合运算中,如果union
    和union all都可以,考虑使用union all 。因为union需要去掉重复的。
  5. 能够不要使用集合运算就不要使用集合运算。

select nullif(0,0)

注意:掌握oracle的常规命令,在学习过程中总结一些优化原则;

方法2:nullif
nullif(表达式A,表达式B)
—-如果表达式A不等于表达式B,则返回表达式A
—-反之返回NULL 

运行结果:null

02-空值和别名

 

我们知道,null与任何数进行任何运算,其结果都等于null,利用这点,我们可以将上面的sql改写为:

A:处理列值为null

declare @a int ---分子
declare @b int ---分母
select @a/nullif(@b,0) as [a除以b]

declare @a int;

oracle中的列值为null做四则运算结果都为null。处理方法:nvl(null,0) 

 

declare @b int;

B:判断列值为null

set @a=10

oracle中判断一个列值为null使用is null 或者is not null

set @b=0

C:给一个列取一个别名可以使用as 或者省略as

select @a/nullif(@b,0)

     select empno as “员工编号” ,
ename 员工姓名 from emp;

其运行结果自然为null了。

     注意:别名需要使用“”,或者不加“”。别名中间有空格的需要“”;

再利用isnull函数,我们就可以实现当@b=0的时候,结果返回1的需求了。最终的sql改写如下:

不能使用单引号;

declare @a int;

D:distinct 取出后面的所有列唯一值

declare @b int;

select distinct job,deptno from emp;这里的distinct作用于后面的所有的列。

set @a=10

            select distinct(job) from emp;可以将加()

set @b=0

E:||
和concat() 将字符连接起来

select isnull(@a/nullif(@b,0),1)

select concat(‘hello’,’world’) from dual;使用concat()后面需要加表。mysql并严格遵循sql1990标准;

OK,两种方法介绍完毕,相对于方法一,我更推荐大家使用方法二,因为方法二的代码更简省。

            select ‘hello’ || ‘world’ from dual;

(如果有朋友对isnull函数不了解的话,这里可以解释一下。

         注意:字符串使用单引号‘’,不能使用双引号“”,使用双引号的是别名。

isnull的定义如下:

dual是伪表;

isnull(参数1,参数2)

03-SQL和iSQLPLUS

发表评论

电子邮件地址不会被公开。 必填项已用*标注