【问题标题】:mysql: 'WHERE something!=true' excludes fields with NULLmysql: 'WHERE something!=true' 不包括 NULL 字段
【发布时间】:2011-03-15 09:27:51
【问题描述】:

我有 2 个表,其中一个我有组,另一个我设置用户限制查看哪些组。 当我执行 LEFT JOIN 并且不指定条件时,它会显示所有记录。当我执行 WHERE group_hide.hide!='true' 时,它只显示这些设置了错误枚举类型的记录。使用 JOIN,其他组将隐藏字段设置为“NULL”。 我怎样才能使它只排除那些设置为 true 的,并显示所有其他具有 NULL 或 false 的内容?

【问题讨论】:

    标签: mysql sql phpmyadmin


    【解决方案1】:

    在 MySQL 中,处理可空值时必须使用 IS NULLIS NOT NULL

    这里你应该使用(group_hide.hide IS NULL OR group_hide.hide != 'true')

    【讨论】:

    【解决方案2】:

    Don 已经为您提出的问题提供了很好的答案,并将解决您当前的问题。

    但是,让我解决错误数据类型域的问题。通常你会将hide 设为 BOOLEAN,但 mysql 并没有真正完全实现它。它将其转换为 TINYINT(1),它允许从 -128 到 127 的值(参见 mysql 的 data types 概述)。由于 mysql 不支持 CHECK 约束,因此您可以选择使用触发器或外部引用来正确执行域。

    以下是错误数据域(您的情况)的问题,按重要性排序:

    • 对于只能为 1 或 0 的字段允许 NULL 的缺点是您必须使用 3 value logic(true、false、null),顺便说一句,这在 SQL 中没有完美实现。这使得某些查询比它们需要的更复杂更慢。如果您可以将列设为 NOT NULL,请执行此操作。
    • 对只能为 1 或 0 的字段使用 VARCHAR 的缺点是查询速度,这是由于额外的 I/O 和更大的存储需求(减慢读取、写入速度,如果字段是索引的一部分并影响备份的大小;请记住,对于 smaller 大小表,但如果数据类型一直设置得太大,或者如果表有大量记录,效果就会受到影响)。此外,您始终需要将 VARCHAR 转换为 1 或 0 以使用自然 mysql 布尔运算符,从而增加查询的复杂性。
    • mysql 将TINYINT(1) 用于BOOL 的缺点是RDBMS 允许某些不应该被允许的值,理论上允许将无意义的值存储在系统中。在这种情况下,您的应用层必须保证数据的完整性,如果 RDBMS 保证完整性总是更好,因为它可以保护您免受应用层中的某些错误以及数据库管理员可能犯的错误。

    【讨论】:

      【解决方案3】:

      一个明显的答案是:

      WHERE (group_hide.hide is null or group_hide.hide ='false')
      

      我不确定 null 行为规则是什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        • 2021-01-20
        • 1970-01-01
        • 2011-06-13
        相关资源
        最近更新 更多