【问题标题】:ms access 2007 SQL "not like" is ignoring blank cellsms access 2007 SQL“不喜欢”忽略空白单元格
【发布时间】:2011-02-17 15:46:05
【问题描述】:

我对尝试运行的一些 SQL 感到困惑。这是一个示例数据集

Username ID        Text1
red55   1235342     fdfdf
black   5542121     sdsd
red32   5542145     sffrds
green   5542911         
bluee   5333121     ffds

所以 SQL 应该是

SELECT username, ID, Text1 
  FROM user_info
 WHERE username NOT LIKE 'red*' 
       AND text1 NOT LIKE 'sd*';

所以我希望看到一个结果集

Username ID        Text1
green   5542911         
bluee   5333121     ffds

但它不起作用。它似乎忽略了空白值。我只会看到一个记录(不像上面的两个)。我需要我的 SQL 来简单地告诉我不以“red”开头的记录以及不以“sd”开头的任何记录。然而,它要么去掉所有的 AND 空格,要么如果我使用 OR 语句,则去掉一个。

有什么想法吗?我被困在这里!

【问题讨论】:

    标签: sql ms-access ms-access-2007 ms-access-2003


    【解决方案1】:

    您需要显式处理空值。一种选择是:

    SELECT username, ID, Text1 
    FROM user_info 
    WHERE (username Is Null OR username NOT LIKE 'red*')
      AND (text1 Is Null OR text1 NOT LIKE 'sd*')
    

    【讨论】:

    • 另一种选择是“设计”可空列。
    • @onedaywhen:我喜欢这个建议,但是有几种方法可以做到。任何关于它的cmets,或指向其他地方讨论它的指针。我对选项的想法是:1. 更改数据类型,2. 定义默认值或 3. 将列转换为另一个表中的行。一个有趣的话题,对我来说几乎所有与架构设计有关的话题。
    • @David-W-Fenton:Hugh Darwen (dcs.warwick.ac.uk/~hugh/TTM/Missing-info-without-nulls.pdf) 的“如何在不使用 NULL 的情况下处理丢失的信息”,尽管您已经阅读过 IIRC 并讨厌它 ;)
    • 啊,是的——那个文章。我讨厌它。它有很多完全的精神错乱。 Null 没有任何问题,但有充分的理由根据具体情况从系统中设计它们。但我绝对不会制定这样做的原则。