【问题标题】:Null Value Statement空值声明
【发布时间】:2011-05-31 17:33:52
【问题描述】:

我创建了一个名为 table1 的表,它有 4 列分别命名为 Name、ID、Description 和 Date。

我已经创建了它们,例如 Name varchar(50) null, ID int null,Description varchar(50) null, Date datetime null

我已将一条记录插入到 table1 中,其中包含 ID 和 Description 值。所以现在我的 table1 看起来像这样:

Name   ID   Description  Date

Null    1    First       Null

其中一个要求我修改表格,使名称和日期列应该具有 Null 值而不是 Text Null。我不知道它们之间有什么区别

我的意思是谁能解释一下这些选择语句之间的区别:

从表 1 中选择 * 名称为空的地方

从表 1 中选择 * WHERE NAME = 'NULL'

从表 1 中选择 * WHERE NAME = ' '

谁能解释一下?

【问题讨论】:

  • 到底是谁问你的?你看到 Null 的原因是有其他的方式来表示一个空值,如果没有值,真正的值应该是一个空值。
  • DBA 告诉我,表中的值表示文本空值,所以你能把它改成空值吗?这就是他要求我做的事情。是的 Ramhound 你能告诉我如何表示空值
  • Sam,你在这个问题和以前的问题中得到了一些令人印象深刻的帮助。除了任务之外,您的 DBA 还给您什么?

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

AFAIC,NULL 之间没有区别。有不同的列类型。但只要列是文本数据类型,并且为 NULL,它就是文本 NULL。

有时会有关于空字符串 ("") 而不是 NULL 的问题,但您使用的描述似乎并没有提到那个。

【讨论】:

    【解决方案2】:

    字符串“Null”是一个字符串。

    NULL的值(或Null或null,SQL在涉及这些东西时不区分大小写)用于表示未知值。如果你愿意,它是一组空值。

    http://www.w3schools.com/sql/sql_null_values.asp

    【讨论】:

      【解决方案3】:

      NULL,在软件中,是没有价值的象征。假设您使用带有null 作为值的字符串插入列,请使用空常量。例如

      INSERT INTO table1 (Name,ID,Description,Date) VALUES (NULL,1,'First',NULL);
      

      请注意,NULL 是 SQL 中的常量,而不是字符串中的单词“NULL”。

      【讨论】:

      • @gbn:从技术上讲,你是对的。但是鉴于它没有改变,在概念上保持它不变会更容易,恕我直言。 [编辑,引用错误的手册]
      【解决方案4】:

      数据确实代表空值。文本“Null”是显示文本的查询工具。

      【讨论】:

        【解决方案5】:

        其中一个要求我修改表格,使名称和日期列应该具有 Null 值而不是 Text Null。我不知道它们之间有什么区别。

        NULL 关键字表示任何值不存在 -- 该值是未知的。

        但这不会阻止某人存储拼写为“NULL”的字母,提供数据类型(INT 和 DATETIME 不会)。因此,IS NULL 之类的运算符无法处理拼写为“NULL”的文本,反之亦然——使用:... LIKE '%NULL%' 搜索字符串不会返回具有NULL 值的记录。

        对于 SQL Server 中的NULL,列的数据类型确实很重要。在 UNION 语句中,您需要将 NULL 转换为适当的数据类型——NULL 的默认值是 INT:

        SELECT CAST('2011-01-01 00:00:00' AS DATETIME)
        UNION
        SELECT CAST(NULL AS DATETIME)
        

        根据提供的有关列和输出的信息,当在结果集中遇到NULL 值时,DBA 似乎要求您更改用于连接到 SQL Server 的客户端的文本。让我想起了我的第一份洗碗工作,并被要求拿到左撇子抹刀......

        【讨论】:

          【解决方案6】:

          SELECT * FROM TABLE1 WHERE NAME IS NULL

          返回名称为 NULL 的所有行

          SELECT * FROM TABLE1 WHERE NAME = 'NULL'

          返回 Name 等于字符串 'NULL' 的所有行,不返回 Null 值

          SELECT * FROM TABLE1 WHERE NAME = ' '

          返回Name恰好等于一个空格''的所有行,不返回Null值

          如果你运行这个语句,它可能有助于清除它什么时候为空,什么时候不是

          select 
          *,
          case 
              WHEN name is null THEN  'Its Null alright' 
                  ELSE 'It has a value'
          END 
          FROM TABLE1
          

          【讨论】:

          • 现在你能告诉我哪些文本为 NULL,值为 Null
          • 第二个返回文本为 NULL 的行。第一个只返回空值
          【解决方案7】:

          在 CREATE TABLE 中,这里的 NULL 或 NOT NULL varchar(50) null 是一个 约束,它决定是否允许 NULL。 NOT NULL 表示没有。

          当你插入数据时,你运行了哪个语句?

          INSERT TABLE1 VALUES (Null, 1, First, Null)
          

          INSERT TABLE1 VALUES ('Null', 1, First, 'Null')
          
          • 第一个使用关键字NULL,插入一个NULL(不是空值:没有这样的东西,可以说)。除 NULL 位图字段外,不存储任何值
          • 第二个有一个字符串“null”,存储了字符 N、U、L、L + 2 个字节的长度

          当你运行SELECT * FROM TABLE1时,客户端工具会显示NULL。

          要测试你是否真的有 NULL 或字符串 NULL,运行这个

          SELECT ISNULL(name, 'fish'), ISNULL(date, GETDATE())  FROM TABLE1
          

          对于 SELECTs

          --null symbols. No value stored
          SELECT * FROM TABLE1 WHERE NAME IS NULL
          --string null
          SELECT * FROM TABLE1 WHERE NAME = 'NULL'
          --empty string
          SELECT * FROM TABLE1 WHERE NAME = ' '
          

          注意:空符号/值不是空字符串。它没有价值,也不会比较。甚至对自己。

          对于您的 DBA,上面带有 ISNULL 的代码将决定存储什么。

          编辑:如果您存储空符号/值,那么您的 DBA 应该阅读“null bitmap

          【讨论】:

            猜你喜欢
            • 2015-05-08
            • 1970-01-01
            • 1970-01-01
            • 2021-07-17
            • 2016-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-08
            相关资源
            最近更新 更多