• 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

    感恩~

  • 相关阅读:
    C#版排序之交换排序
    AndroidSQLite(一)
    oracle日期处理完整版
    B+树查询上下级(sql实现)
    PHP写的几个基础算法 (转载)
    FLEX程序设计正则表达式
    SQL*PLUS命令的使用大全
    oracle常用sql语句语法
    PHP.ini配置文件(转载)
    string扩展实现强悍的.Net不可逆加密方法 (转载)
  • 原文地址:https://www.cnblogs.com/pengzhen/p/3860649.html
Copyright © 2020-2023  润新知