如果通过CAST()必威函数将这个值转换为decimal类型

摘自:

利用nullif函数

01-基本的询问语句

01-基本的询问语句

SQL常用函数计算

那是自家在品种支付中运用db2数据库写存款和储蓄进程的时候日常接纳的sql函数。希望对大家享有助于;

摘要:
下文介绍sql server中,sql脚本幸免出现除零谬误的艺术分享

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

A:一些发令

A:一些命令

sql cast函数

(1).CAST()函数的参数是三个表达式,它概括用AS关键字分隔的源值和对象数据类型。以下例子用于将文本字符串'12'转变为整型:

 SELECT CAST('12' AS int)

(2).重临值是整型值12。假使打算将一个意味小数的字符串转变为整型值,又会并发什么情况吗?

SELECT CAST('12.5' AS int)  

(3).CAST()函数和CONVERT()函数都不可能试行四舍五入或截断操作。由于12.5无法用int数据类型来代表,所以对那几个函数调用将时有发生一个不当:

Server: Msg 245, Level 16, State 1, Line 1

Syntax error converting the varchar value

'12.5' to a column of data type int.

(4).要回去三个官方的数值,就亟须采用能管理那几个值的数据类型。对于这么些例子,存在三个可用的数据类型。要是经过CAST()函数将这么些值转换为decimal类型,要求首先定义decimal值的精度与小数位数。在本例中,精度与小数位数分别为9 与2。精度是总的数字位数,满含小数点左侧和侧面位数的总额。而小数位数是小数点左边的位数。那意味着本例能够帮助的最大的整数值是9999999,而细小的小数是0.01。

SELECT CAST('12.5' AS decimal(9,2))

decimal数据类型在结果网格大校显示存效小数位: 12.50

(5).精度和小数位数的暗中认可值分别是18与0。假设在decimal类型中不提供那四个值,SQL Server将截断数字的小数部分,而不会生出错误。

SELECT CAST('12.5' AS decimal)

    结果是一个整数值:12

再有三个状态我们亟须用到cast函数调换数据,那正是当大家在同一个select语句中对sum()的值总括比时,必须用cast转变。如下:

select sum(a),sum(b),case when sum(b) = 0 then 0 else (cast sum(a) as double)/sum(b) end from table

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. 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终止写入文件中。

sql case函数

在下边包车型大巴讲话中,大家就用到了case函数来做决断,当sum(b) =0是不可能做分母,大家就令这些字段的值为0,不然,计算出sum(a)和sum(b)的比;

在种种业务系统开拓中,经常会蒙受除零的荒唐,下文分享了二种管理办法:
方法1: case when end 

其效果正是:如若八个钦定的表达式相等,就赶回null值。

B:sql优化原则

B:sql优化原则

 sql中COALESCE()函数的作用

归来其参数中的第多少个非空表明式。那几个函数是对null进行决断,而不是‘’。

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. 可见不要采用会集运算就不用采纳集合运算。
  1. 询问的时候尽量使用列名;如:select ename,sal from emp; 
  2. 分组查询没有多行函数(聚合函数),如若应用过滤,考虑使用where依旧having
  3. 在子查询和多表查询之间采纳,尽量接纳多表查询
  4. 在联谊运算中,假如union 和union all都能够,思念接纳union all 。因为union必要去掉重复的。
  5. 能够不要采取集结运算就不用选用集结运算。

 sql trim()函数

去掉四头空格
sql语法中绝非一贯删除五头空格的函数,但有ltrim()去除左空格rtrim()去除右空格。
合起来用就是sql的trim()函数,即select ltrim(rtrim(UsrName))


select nullif(0,0)

留意:精通oracle的例行命令,在就学进度中总括一些优化原则;

在乎:领会oracle的正规命令,在攻读进程中总计一些优化原则;

sql NULLIF函数

借使七个钦赐的表达式相等,则赶回空值。
语法NULLIF ( expression1 , expression2 )
参数expression1,expression2
常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的即兴组合。
回来类型再次来到类型与第二个 expression1 一律。
输出结果:
要是八个表达式不等于,NULLIF 重临第贰个 expression1 的值。
万一七个表明式相等,NULLIF 再次回到空值NULL。  
SQLServer函数是平等的功效
例子: PRINT NULLIF('222','') --返回222
P福睿斯INT ISNULL(NULLIF('222','222'),'23') --重返23 评释再次回到的是null

方法2:nullif
nullif(表达式A,表达式B)
—-如若表达式A不对等表达式B,则赶回表明式A
—-反之再次来到NULL 

运营结果:null

02-空值和小名

02-空值和外号

sql char函数

char(current date,ISO)——转换成yyyy-mm-dd
char(current date,USA)——转换成mm/dd/yyyy
char(current date,EUR)——转换成dd.mm.yyyy

 

咱俩掌握,null与别的数进行任何运算,其结果都特别null,利用那点,大家可以将上面的sql改写为:

A:处理列值为null

A:管理列值为null

sql Date函数

DATE()函数是提取日期或日期/时间表达式的日子部分。
MySQL 使用下列数据类型在数据库中存款和储蓄日期或日期/时间值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
YEAR - 格式 YYYY 或 YY

SQL Server 使用下列数据类型在数据库中积存日期或日期/时间值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: 独一的数字

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

declare @a int;

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

oracle中的列值为null做四则运算结果都为null。管理格局:nvl(null,0) 

 SQL 中ROLLUP 用法

ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集。
上边是 CUBE 和 ROLLUP 之间的切实可行分歧:
CUBE 生成的结果集体现了所选列中值的保有组成的集中。
ROLLUP 生成的结果集体现了所选列中值的某一等级次序结构的聚合。
ROLLUP 优点:
(1)ROLLUP 再次回到单个结果集,而 COMPUTE BY 再次回到七个结果集,而两个结实集会增添应用程序代码的错综相连。
(2)ROLLUP 能够在服务器游标中央银行使,而 COMPUTE BY 则不得以。
(3)有时,查询优化器为 ROLLUP 生成的施行安插比为 COMPUTE BY 生成的进一步便捷。

上面临比一下GROUP BY 、CUBE 和 ROLLUP后的结果
创建表:

CREATE TABLE DEPART 
(部门 char(10),员工 char(6),工资 int)
INSERT INTO DEPART SELECT 'A','ZHANG',100 
INSERT INTO DEPART SELECT 'A','LI',200 
INSERT INTO DEPART SELECT 'A','WANG',300 
INSERT INTO DEPART SELECT 'A','ZHAO',400 
INSERT INTO DEPART SELECT 'A','DUAN',500 
INSERT INTO DEPART SELECT 'B','DUAN',600 
INSERT INTO DEPART SELECT 'B','DUAN',700

部门 员工 工资
A ZHANG 100
A LI 200
A WANG 300
A ZHAO 400
A DUAN 500
B DUAN 600
B DUAN 700

(1)GROUP BY

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工

结果:
A DUAN 500
B DUAN 1300
A LI 200
A WANG 300
A ZHANG 100
A ZHAO 400
(2)ROLLUP

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工 WITH ROLLUP

结果如下:

A DUAN 500 
A LI 200 
A WANG 300 
A ZHANG 100 
A ZHAO 400 
A NULL 1500 
B DUAN 1300 
B NULL 1300 
NULL NULL 2800

ROLLUP结果聚集多了三条聚集国国投息:即部门A的构和,部门B的商讨以及总左券。其大校单位B中的DUAN合计。
等价于下列SQL语句

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工 
union 
SELECT 部门,'NULL',SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门 
union 
SELECT 'NULL','NULL',SUM(工资)AS TOTAL 
FROM DEPART

结果:
A DUAN 500
A LI 200
A NULL 1500
A WANG 300
A ZHANG 100
A ZHAO 400
B DUAN 1300
B NULL 1300
NULL NULL 2800
(3)CUBE

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工 WITH CUBE

结果:
A DUAN 500
A LI 200
A WANG 300
A ZHANG 100
A ZHAO 400
A NULL 1500
B DUAN 1300
B NULL 1300
NULL NULL 2800
NULL DUAN 1800
NULL LI 200
NULL WANG 300
NULL ZHANG 100
NULL ZHAO 400
CUBE的结果集是在 ROLLUP结果集的根基上多了5行,那5行也正是在ROLLUP结果集上在union 上以员工(即CUBE)为 GROUP BY的结果。

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工 WITH CUBE

等价于下列的SQL语句:

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工 WITH ROLLUP
union
SELECT 'NULL',员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 员工

结果:
NULL NULL 2800
A NULL 1500
A DUAN 500
A LI 200
A WANG 300
A ZHANG 100
A ZHAO 400
B NULL 1300
B DUAN 1300
NULL DUAN 1800
NULL LI 200
NULL WANG 300
NULL ZHANG 100
NULL ZHAO 400

 

declare @b int;

B:推断列值为null

B:判别列值为null

sql UNION 操作符

UNION 操作符用于合併八个或多个 SELECT 语句的结果集。
请当心,UNION 内部的 SELECT 语句必需有所同等数量的列。列也必须具有相似的数据类型。相同的时间,每条 SELECT 语句中的列的逐个必得一律。
SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

讲解:私下认可地,UNION 操作符选用分歧的值,即UNION是去了重的。倘使同意再一次的值,请使用 UNION ALL。
SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

别的,UNION 结果集中的列名总是等于 UNION 中首先个 SELECT 语句中的列名。

set @a=10

oracle中判别贰个列值为null使用is null 只怕is not null

oracle中判定四个列值为null使用is null 只怕is not null

sql Merge函数

通过这么些merge你可见在四个SQL语句中对三个表同有时间实行inserts和updates操作. 自然是update仍然insert是基于于您的钦赐的口径剖断的,Merge into能够实现用B表来更新A表数据,若是A表中从不,则把B表的数码插入A表. ME凯雷德GE命令从叁个或八个数据源中甄选行来updating或inserting到五个或三个表

语法如下

MERGE INTO [your table-name] [rename your table here] 
USING ( [write your query here] )[rename your query-sql and using just like a table] 
ON ([conditional expression here] AND [...]...) 
WHEN MATHED THEN [here you can execute some update sql or something else ] 
WHEN NOT MATHED THEN [execute something else here ! ] 

大家先看看二个粗略的事例,来介绍四个merge into的用法

merge into products p using newproducts np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 

在这几个例子里。前边的merger into products using newproducts 表示的用newproducts表来merge到products表,merge的相配关系正是on前面包车型地铁基准子句的开始和结果,这里依据多少个表的product_id来开展相称,那么相配上了我们的操作是正是when matched then的子句里的动作了,这里的动作是update set p.product_name = np.product_name, 很鲜明就是把newproduct里的内容,赋值到product的product_name里。若无相配上则insert那样的一条语句进去。 我们看看那一个merget inot的用法是或不是了然入怀了哟。这里merger的功能,好比比较,然后接纳翻新可能是插入,是一多重的组合拳,在做merge的时候,那样平等的动静下,merge的性质是巨惠同等效力的update/insert语句的。

set @b=0

C:给一个列取三个别称能够运用as 要么轻松as

C:给贰个列取贰个别名能够运用as 要么轻易as

sql substr函数

substr(字符串,截取伊始地点,截取长度) //重临截取的字

substr('Hello World',0,1) //重回结果为 'H'  *从字符串第贰个字符开端截取长度为1的字符串

substr('Hello World',1,1) //重临结果为 'H'  *0和1都以代表截取的开始位置为率先个字符

substr('Hello World',2,4) //重返结果为 'ello'

substr('Hello World',-3,3)//再次回到结果为 'rld' *负数(-i)表示截取的上马位置为字符串右端向左数第i个字符

测试:

select substr('Hello World',-3,3) value from dual;

 

附:java中substring(index1,index2)的简短用法

作用:从字符串索引(下标)为index1的字符开端截取长度为index2-index1 的字符串。

String str="Hello World";

System.out.println(str.substring(0,5));

打字与印刷结果为:Hello

select @a/nullif(@b,0)

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

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

sql REPLACE函数

REPLACE
用第多少个表达式替换第三个字符串表明式中冒出的全体第贰个给定字符串表达式。

语法
REPLACE ( ''string_replace1'' , ''string_replace2'' , ''string_replace3'' )

参数
''string_replace1''

待搜索的字符串表明式。string_replace1 能够是字符数据或二进制数据。

''string_replace2''

待查找的字符串表明式。string_replace2 能够是字符数据或二进制数据。

''string_replace3''

轮换用的字符串表达式。string_replace3 能够是字符数据或二进制数据。

回来类型
如果 string_replace(1、2 或 3)是帮助的字符数据类型之一,则赶回字符数据。假诺 string_replace(1、2 或 3)是永葆的 binary 数据类型之一,则赶回二进制数据。

示例
下例用 xxx 替换 abcdefghi 中的字符串 cde。

SELECT REPLACE(''abcdefghicde'',''cde'',''xxx'')GO
上面是结果集:

------------abxxxfghixxx(1 row(s) affected)

其运作结果当然为null了。

     注意:别称必要运用“”,恐怕不加“”。别称中级有空格的内需“”;

     注意:别称必要选用“”,或许不加“”。小名高级中学级有空格的急需“”;

sql PARTITION BY 函数

SQL的partition by 字段(可达成机关分配组号跟归组合併)

先看例子:

if object_id('TESTDB') is not null drop table TESTDB

create table TESTDB(A varchar(8), B varchar(8))

insert into TESTDB

select 'A1', 'B1' union all

select 'A1', 'B2' union all

select 'A1', 'B3' union all

select 'A2', 'B4' union all

select 'A2', 'B5' union all

select 'A2', 'B6' union all

select 'A3', 'B7' union all

select 'A3', 'B3' union all

select 'A3', 'B4'

-- 全体的消息

SELECT * FROM TESTDB

A    B


A1  B1

A1  B2

A1  B3

A2  B4

A2  B5

A2  B6

A3  B7

A3  B3

A3  B4

-- 使用PARTITION BY 函数后

SELECT *,ROW_NUMBER() OVER(PARTITION BY A ORDER BY A DESC) NUM FROM TESTDB

A   B   NUM


A1  B1  1

A1  B2  2

A1  B3  3

A2  B4  1

A2  B5  2

A2  B6  3

A3  B7  1

A3  B3  2

A3  B4  3

 

能够看出结果中多出一列NUM 这几个NUM正是声明了毫无二致行的个数,比方A1有3个,他就给种种A1标上是第多少个。

-- 仅仅使用ROW_NUMBER() OVER的结果

SELECT *,ROW_NUMBER() OVER(ORDER BY A DESC)NUM FROM TESTDB

 A   B     NUM


A3  B7   1

A3  B3   2

A3  B4   3

A2  B4   4

A2  B5   5

A2  B6   6

A1  B1   7

A1  B2   8

A1  B3   9

能够见到它只是可是标出了行号。

再利用isnull函数,我们就能够达成当@b=0的时候,结果再次回到1的供给了。最后的sql改写如下:

无法应用单引号;

不能够运用单引号;

sql 循环函数

 sql 的循环函数是特大震慑数据库查询速度的,我们在询问的时,尽量制止使用;

本文由必威发布于必威-数据,转载请注明出处:如果通过CAST()必威函数将这个值转换为decimal类型

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。