精华内容
下载资源
问答
  • sql server 数据库中null 转换为 0

    千次阅读 2019-04-25 19:17:37
    sql server 数据库中null 转换为 0
                   

    ISNULL   使用指定的替换值替换   NULL。   
        
      语法:ISNULL   (   check_expression   ,   replacement_value   )     
        
      参数:check_expression   
        
      将被检查是否为NULL的表达式。check_expression   可以是任何类型的。   
        
      replacement_value   
        
    在check_expression 为 NULL时将返回的表达式。replacement_value 必须与check_expresssion具有相同的类型。   

    例子:select Isnull([columnA], 0) - Isnull([columnB], 0) from A

               
    展开全文
  • Go语言:解决数据库中null值的问题

    万次阅读 2017-12-12 12:50:38
    Go语言:解决数据库中null值的问题 本文主要介绍如何使用go语言database/sql库从数据库中读取null值的问题,以及如何向数据库中插入null值。本文在这里使用的是sql.NullString, sql.NullInt64, sql.NullFloat64等...

    Go语言:解决数据库中null值的问题

    本文主要介绍如何使用go语言database/sql库从数据库中读取null值的问题,以及如何向数据库中插入null值。本文在这里使用的是sql.NullString, sql.NullInt64, sql.NullFloat64等结构体,为了方便书写,它们的泛指我会使用sql.Null***来表示

    要点

    1. 从数据库读取可能为null值得值时,可以选择使用sql.NULL***来读取;或者使用IFNULL、COALESCE等命令让数据库查询值返回不为”“或者NULL
    2. 若需要往数据库中插入null值,则依然可以使用sql.NULL***存储所需的值,然后进行插入NULL值
    3. 直接使用sql.NULL***类型容易出现valid遗漏设置等问题,普通int、string与其转换时,请写几个简单的get、set函数

    本demo使用的数据库表以及数据如下

    mysql> desc person;
    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | id         | int(11)      | NO   | PRI | NULL    | auto_increment |
    | first_name | varchar(100) | NO   |     | NULL    |                |
    | last_name  | varchar(40)  | YES  |     | NULL    |                |
    | age        | int(11)      | YES  |     | NULL    |                |
    +------------+--------------+------+-----+---------+----------------+
    
    mysql> select * from person;
    +----+------------+-----------+------+
    | id | first_name | last_name | age  |
    +----+------------+-----------+------+
    |  1 | yousa      | NULL      | NULL |
    +----+------------+-----------+------+
    
    mysql> show create table person;
    +--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table  | Create Table                                                                                                                                                                                                                                           |
    +--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | person | CREATE TABLE `person` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `first_name` varchar(100) NOT NULL,
      `last_name` varchar(40) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
    +--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    从数据库中读取NULL值

    如果不作处理直接从数据库中读取NULL值到string/int,会发生如下错误错误

    Scan NULL值到string的报错
    sql: Scan error on column index 1: unsupported Scan, storing driver.Value type <nil> into type *string
    
    Scan NULL值到int的报错
    sql: Scan error on column index 1: converting driver.Value type <nil> ("<nil>") to a int: invalid syntax
    

    使用如下的struct来读取数据库内容

    
    type Person struct {
        firstName               string
        lastName                string 
        age                     int
    }
    
        //由于只有一行,直接使用QueryRow
        row := db.QueryRow("SELECT first_name, last_name FROM person WHERE first_name='yousa'")
        err = row.Scan(&hello.firstName, &hello.lastName)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(hello)
    
        row1 := db.QueryRow("SELECT first_name, age FROM person WHERE first_name='yousa'")
        err = row1.Scan(&hello.firstName, &hello.age)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(hello)

    运行代码,可以通过日志看出来,错误来自Scan将NULL值赋值给int或者string时,报错;解决这个问题可以使用sql原生结构体sql.Null***来解决

    使用sqlNull***

    sql.Null***在sql库中声明如下,在读取时,(比如读取的值存储到NullInt64),假如发现存储的值是NULL,则会将NullInt64的valid设置为false,然后不会将值存储到Int64中,Int64值默认为0,如果是NullString则String值时nil;如果是正常值,则会将Valid赋值为true,将值存储到Int64中。

    type NullInt64 struct {
        Int64 int64
        Valid bool // Valid is true if Int64 is not NULL
    }
    func (n *NullInt64) Scan(value interface{}) error
    func (n NullInt64) Value() (driver.Value, error)
    
    type NullString struct {
        String string
        Valid  bool // Valid is true if String is not NULL
    }
    func (ns *NullString) Scan(value interface{}) error
    func (ns NullString) Value() (driver.Value, error)

    代码修改为如下:

    type Person struct {
        firstName               string
        lastNullName            sql.NullString
        nullAge                 sql.NullInt64
    }
    
        rowNull := db.QueryRow("SELECT first_name, last_name FROM person WHERE first_name='yousa'")
        err = rowNull.Scan(&hello.firstName, &hello.lastNullName)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(hello)
    
        rowNull1 := db.QueryRow("SELECT first_name, age FROM person WHERE first_name='yousa'")
        err = rowNull1.Scan(&hello.firstName, &hello.nullAge)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(hello)
    

    输出结果

    {yousa  0 { false} {0 false}}
    {yousa  0 { false} {0 false}}

    使用IFNULL或者COALESCE

    coalesce()解释:返回参数中的第一个非空表达式(从左向右依次类推)

    IFNULL(expr1,expr2):如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。

    查询语句使用一个默认值来替换NULL即可

    SELECT first_name, COALESCE(age, 0) FROM person;//
    SELECT first_name, IFNULL(age, 0) FROM person;//

    往数据库中插入NULL值

    前面我们对SELECT语句使用了sql.Null***类型,同理,INSERT、UPDATE语句也可以通过使用这种类型来插入nil值

    代码如下:

        hello := Person {
            firstName: "",
            lastName: "",
            age: 0,
            lastNullName: sql.NullString{String:"", Valid:false},
            nullAge: sql.NullInt64{Int64:0, Valid:false}}
        _, err = db.Exec(
            "INSERT INTO person (first_name, last_name) VALUES (?, ?)", "yousa1", hello.lastName)
        if err != nil {
            fmt.Println(err)
        }
    
        _, err = db.Exec(
            "INSERT INTO person (first_name, last_name) VALUES (?, ?)", "yousa2", hello.lastNullName)
        if err != nil {
            fmt.Println(err)
        }
    
    
    //数据库插入结果
    mysql> select * from person;
    +----+------------+-----------+------+
    | id | first_name | last_name | age  |
    +----+------------+-----------+------+
    |  1 | yousa      | NULL      | NULL |
    |  2 | yousa1     |           | NULL |
    |  3 | yousa2     | NULL      | NULL |
    +----+------------+-----------+------+

    解释下db.Exec操作hello.lastNullName的过程:

    首先它会调用hello.lastNullName的Value方法,获取到driver.Value,然后检验Valid值是true还是false,如果是false则会返回一个nil值(nil值传给sql driver会被认为是NULL值),如果是true则会将hello.lastNullName.String的值传过去。

    PS: 为了保证你所插入的值能如你所期望是NULL值,一定记得要将sql.Null***中Valid值置为false

    使用NULL还是有很多危害的,再回顾下数据库中使用NULL值的危害

    为什么不建议使用NULL

    1. 所有使用NULL值的情况,都可以通过一个有意义的值的表示,这样有利于代码的可读性和可维护性,并能从约束上增强业务数据的规范性。
    2. NULL值在timestamp类型下容易出问题,特别是没有启用参数explicit_defaults_for_timestamp
    3. NOT IN、!= 等负向条件查询在有 NULL 值的情况下返回永远为空结果,查询容易出错
    4. Null 列需要更多的存储空间:需要一个额外字节作为判断是否为 NULL 的标志位
    5. NULL值到非NULL的更新无法做到原地更新,更容易发生索引分裂,从而影响性能。

    PS:但把NULL列改为NOT NULL带来的性能提示很小,除非确定它带来了问题,否则不要把它当成优先的优化措施,最重要的是使用的列的类型的适当性。

    当然有些情况是不得不使用NULL值进行存储,或者在查询时由于left/right join等导致NULL值,但总体来说,能少用就少用。

    helper func(提升效率/减少错误)

    如果使用sql.NULL***的话,由于其有两个字段,如果直接手动赋值的话还是很容易遗漏,所以还是需要简单的转换函数,这里给了两个简单的helper fuc,分别是将int64转换成NullInt64和将string转换成NullString

    //ToNullString invalidates a sql.NullString if empty, validates if not empty
    func ToNullString(s string) sql.NullString {
        return sql.NullString{String : s, Valid : s != ""}
    }
    
    //ToNullInt64 validates a sql.NullInt64 if incoming string evaluates to an integer, invalidates if it does not
    func ToNullInt64(s string) sql.NullInt64 {
        i, err := strconv.Atoi(s)
        return sql.NullInt64{Int64 : int64(i), Valid : err == nil}
    }

    参考博客

    https://github.com/go-sql-driver/mysql/issues/34

    https://github.com/guregu/null

    https://gocn.io/question/243

    https://godoc.org/database/sql

    http://url.cn/5cFTz4W 一千个不用 Null 的理由

    展开全文
  • 常见数据库中null值替换问题 在编程过程中常会遇到将数据库中读取到的null值替换为我们想要的值得情况,现将我们常见的数据库null值转换函数总结如下: 一、SQLServer 中null值替换   方法:ISNULL()   ...

    常见数据库中null值替换问题

    在编程过程中常会遇到将数据库中读取到的null值替换为我们想要的值得情况,现将我们常见的数据库null值转换函数总结如下:

    一、SQLServer 中null值替换

           方法:ISNULL()

       语法:ISNULL ( check_expression , replacement_value )

       参数:

             check_expression:将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。

             replacement_value:在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion

                                具有相同的类型

       返回类型:返回与 check_expression 相同的类型。

       注意如果 check_expression 不为 NULL,那么返回该表达式的值;否则返回 replacement_value。

       示例:

                 

               SELECT ISNULL(age,23) FROM person WHERE age IS NULL;

    二、Oracle 中null值替换

       方法:NVL()

       语法:NVL(eExpression1, eExpression2)

       参数:

             eExpression1, eExpression2:如果 eExpression1 的计算结果为 null 值,则 NVL() 返回 eExpression2。如果eExpression1 的计算结果不是 null 值,则返回 eExpression1。eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( )返回 NULL

       返回类型:返回与eExpression1相同的类型。常见有:字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null 值

       注意在不支持 null 值或 null 值无关紧要的情况下,可以使用 NVL( ) 来移去计算或操作中的 null 值。

      示例:

             SELECT NVL(age,23) FROM person WHERE age IS NULL;

    三、MySQL中null值替换

       方法:IFNULL()

       语法:IFNULL(expr1,expr2)

       参数:

             假如expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。

       返回类型:

       注意

      示例:

               SELECT IFNULL(age,23) FROM person WHERE age IS NULL;
    

    展开全文
  • Java对数据库中NULL的处理

    千次阅读 2011-08-23 17:56:57
    Java中NULL的概念:NULL表示类或变量是空,不代表任何对象或实例,可以将NULL赋给引用类型...数据库中NULL的概念:数据库中,NULL表示未填写、未知、不可用的概念,和java不同的是数据库中可以将NULL赋给任何数据类型。
     
    

    Java中NULL的概念:NULL表示类或变量是空,不代表任何对象或实例,可以将NULL赋给引用类型变量,但不可以将NULL赋给基本类型变量。

    数据库中NULL的概念:数据库中,NULL表示未填写、未知、不可用的概念,和java不同的是数据库中可以将NULL赋给任何数据类型。

    那么,我们从数据库中读取字段的值后,在java程序中如何判断读取的值是否为NULL呢?用X==NULL方法吗?显然不行,除非这个X是String类型的。ResultSet中的wasNull()方法可以解决这个问题:

    wasNull():报告最后一个读取的列是否具有值 SQLNULL。注意,必须首先对列调用一个获取方法尝试读取其值,然后调用wasNull方法查看读取的值是否为 SQLNULL

    代码如下:

    String address = rs.getString("Address");
        if (rs.wasNull()){
         myusers.setAddress("");
        }else{
         myusers.setAddress(address);
        }
     String phone = rs.getString("Phone");
        if (rs.wasNull()){
         myusers.setPhone("");
        }else{
         myusers.setPhone(phone);
        }

    展开全文
  • 数据库中null处理

    千次阅读 2018-08-12 21:46:42
    判断null值必须使用is null 或is not null 不能使用=null或!=null 例:1.select * from tbstudent where tsage is null --查询所有tsage例为空的同学信息  2.select * from tbstudent where tsage is not null -...
  • Go语言:解决数据库中null值的问题 转载: 作者:绯浅yousa 来源:CSDN 原文:https://blog.csdn.net/qq_15437667/article/details/78780945 版权声明:本文为博主原创文章,转载请附上博文链接! 要点 从数据库读取...
  • java对数据库中NULL的处理

    千次阅读 2009-11-18 16:46:00
    数据库中NULL的概念:数据库中,null表示未填写、未知、不可用的概念,和java不同的是数据库中可以将null赋给任何数据类型。这样一来,我们从数据库中读取字段的值后,在java程序中如何判断读取的值是否为null呢?用x...
  • 关于数据库中NULL的描述,下列哪些说法符合《阿里巴巴Java开发手册》:答案在文末 A. NULL=NULL的返回结果为true。 B. NULL与任何值的比较结果都为NULL。 C. NULL<>1的返回结果为true。 D. 当某一列的值全是...
  • 有人总结了数据库中Null值的概念,比较精炼,摘录如下:  Null是数据库中特有的数据类型,当一条记录的某个列为Null,则表示这个列的值是未知的、是不确定的。既然是未知的,就有无数种的可能性。因此,Null并不是...
  • Go:解决数据库中null值的问题

    千次阅读 2020-05-11 14:39:46
    定义的结构体中 结构体成员类型为string,从mysql数据库中查询数据中有NULL值,go语言执行scan操作时不能转换。 查询有两种方法解决 1、定义类型为sql.NullString 共有如下类型 sql.NullString sql.NullBool sql....
  • golang解决数据库中null值的问题

    千次阅读 2018-01-25 09:11:33
    要点 从数据库读取可能为null值得值时,可以选择使用sql.NULL***来读取;或者使用IFNULL、COALESCE等命令让数据库查询值返回不... 若需要往数据库中插入null值,则依然可以使用sql.NULL***存储所需的值,然后进行插
  • 数据库中NULL的搜索

    2015-07-24 16:23:00
    如果数据库某个字段是enum枚举类型,有选项NULL 那么,想要通过sql语言找到这一条记录,判断语句为xxx IS NULL,不能用=来找
  • Oracle 数据库中null字段赋值方法

    千次阅读 2019-05-28 16:10:11
    最近做数据迁移工作,某个字段在源表可为空,在目标表不能为空。迁移数据的时候需要给查出的空值赋一个默认值。 用到的函数为: NVL(expr1,expr2) expr1:可为空的字段或者表达式。 expr2:null的替代值。 ...
  • 数据库中null 与 blank=True的区别

    千次阅读 2018-10-18 10:24:39
    null是在数据库上表现NULL,而不是一个空字符串; 需要注意的是,日期型(DateField、TimeField、DateTimeField)和数字型(IntegerField、DecimalField、FloatField)不能接受空字符串,如要想要在填写表单的时候这...
  • 数据库中null和空字符串问题

    千次阅读 2019-11-06 09:39:15
    https://www.cnblogs.com/duhuo/p/6282743.html null 和 “空值” 的 是否占用空间。 https://www.iteye.com/blog/jackyrong-2076933
  • 数据库中NULL 与‘’是不同的,因此 select * from
  • 数据库中null值转成0

    千次阅读 2017-08-21 17:51:38
    在SQL语言,很多时候,在表项中会遇到null值,null值有三大特点:1)NULL值不参加统计;2)NULL值不进入计算表达式;3)不能与其它值进行比较。 因此,在运算要将null值有时候转换成其他值,这里提供一种加减...
  • null是在数据库上表现NULL,而不是一个空字符串; 需要注意的是,日期型(DateField、TimeField、DateTimeField)和数字型(IntegerField、DecimalField、FloatField)不能接受空字符串,如要想要在填写表单的时候这...
  • 数据库中存在null,那么怎样查找这些值是null的记录呢? 查找到某一个字段是null的记录,最简单的想法可能是这样: select *from tableName where columnName = null 但是这样是不行的,因为null不能和任何...
  • 打个比喻就是空值表示一个杯子是真空状态,什么都没有,而null值是杯子有空气。 发现向colA一列插入空值成功,而colB列既可以插入空值,也可以插入NULL值。总结一下 ,定义为NOT NULL的字段只能插入空值,不能插入...
  • javanull表示类或对象的变量是空,不代表任何对象或实例,可以将null赋给引用类型变量,但不可以将null赋给基本类型变量;任何对象在没有进行初始化时,它默认的值都是null。没有实体的对象称为空对象;空对象不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,506
精华内容 8,202
关键字:

数据库中null