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

感恩~

你可能感兴趣的:(sql)