【问题标题】:MySQL: SELECT all except when one column contains one particular value and another contains another specific valueMySQL:选择全部,除非一列包含一个特定值而另一列包含另一个特定值
【发布时间】:2018-10-16 22:18:47
【问题描述】:

所以我试图从这个表中做一个选择语句:

+--------+-------+--------+
| LETTER | COLOR | NUMBER |
+--------+-------+--------+
| A      | red   | 1      |
| B      | red   | 2      |
| A      | black | 3      |
| C      | red   | 4      |
| B      | black | 5      |
| D      | red   | 6      |
| E      | red   | 7      |
| C      | black | 8      |
| C      | black | 9      |
| C      | red   | 10     |
+--------+-------+--------+ 

基本上,我想做一个“SELECT *”,但跳过字母为 C 并且颜色为“黑色”的行。

换句话说,SELECT 的结果将是整个表,除了倒数第二行。

我将如何构建该语句?

【问题讨论】:

    标签: mysql select


    【解决方案1】:

    最直接的方法是否定条件,使用 NOT 运算符:

    SELECT t.*
      FROM this_table t 
     WHERE NOT ( t.letter = 'C' AND t.color = 'black' )
           ^^^
    

    请注意,我们将条件括在括号中,以便 NOT 适用于整个条件的结果。

    但这并没有考虑到lettercolor 列中可能存在的NULL 值。

    为了更精确地匹配规范(我们没有关于是否允许 NULL 值的信息),我们可以使用 MySQL 空安全比较 <=>(太空飞船)运算符代替相等 = 比较运算符。

    SELECT t.*
      FROM this_table t 
     WHERE NOT ( t.letter <=> 'C' AND t.color <=> 'black' )
           ^^^
    

    括号内的AND 运算符的否定将是OR,所以我们也可以这样写:

    SELECT t.*
      FROM this_table t 
     WHERE NOT ( t.letter <=> 'C' )
        OR NOT ( t.color  <=> 'black' )
           ^^^ 
    

    如果我们想使用不等比较运算符(&lt;&gt;),我们可以不使用NOT运算符得到等价的结果...

    SELECT t.*
      FROM this_table t 
     WHERE ( t.letter <> 'C'     OR t.letter IS NULL )
        OR ( t.color  <> 'black' OR t.color  IS NULL )
    

    【讨论】:

      猜你喜欢
      • 2020-04-06
      • 2022-11-10
      • 2013-07-28
      • 1970-01-01
      • 2021-11-16
      • 2012-09-05
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多