SQL 计算列

 

SQL计算列,可以解决一般标量计算(数学计算,如ColumnA*ColumnB)的问题,而子查询计算(如select sum(salary) from tableOther where id=’ABC’)则没有相应的支持,可以使用触发器的方式来进行实时运算,但是需要增加维护成本。

在《数据库重构》一书中,这属于结构重构的内容。

 

以下应用内容来自网络,稍稍排版之后就搬家到这里了,感谢各位大神的贡献:

 

Eg1:身份证号的生日

表中有“身份证”字段 ,如何利用计算所得的列规范 根据“身份证”字段生成自动得出的“生日”字段。请给出相关代码

身份证 生日(自动得出并且数据类型为datetime)310501198408097619 1984-08-09
解决方法:

use tempdb
go
create table t1
(
身份证  varchar(18),
生日 as case LEN(身份证) when 18 
        then substring(身份证,7,4)+'-'+substring(身份证,11,2)+'-'+substring(身份证,13,2)
        else '19'+substring(身份证,7,2)+'-'+substring(身份证,9,2)+'-'+substring(身份证,11,2)
        end
)
go
insert t1 select '310501198408097619'
go
select * from t1
go
/**
身份证 生日
----------------------------------
310501198408097619    1984-08-09
**/
drop table t1
go

在计算所得的列规范属性---公式中写:

(case len([身份证]) when (18) then (((substring([身份证],(7),(4))+'-')+substring([身份证],(11),(2)))+'-')+substring([身份证],(13),(2)) else (((('19'+substring([身份证],(7),(2)))+'-')+substring([身份证],(9),(2)))+'-')+substring([身份证],(11),(2)) end)

是持久的 指示是否存储公式的计算结果。如果此属性设置为“否”,则只存储公式,每次引用此列时都会计算公式的值。

 

Eg2:日期差

比如说我现在有列A,列B,列A存储的是借书的时间,列B存储的是还书的时间,我希望有列C,C存储是B-A的天数,当向表中插入还书时间时,列C就会计算出借书的天数,请问应该如何实现。

解决方法:

USE [aa] CREATE TABLE [dbo].[Table_1]( [A] [datetime] NULL, [B] [datetime] NULL, [C] AS (isnull(DATEDIFF(day,[A],[B]),'')) 计算列所得的规范,公式中写(isnull(datediff(day,[A],[B]),''))

 

其他参考:http://www.cnblogs.com/jinzhenshui/archive/2009/12/16/1625334.html

http://www.cnblogs.com/wyfs/archive/2012/03/09/2387712.html

感恩~

posted @ 2014-07-22 15:23  _DN  阅读(1957)  评论(0编辑  收藏  举报