mysql - 如果 mysql 中的条件未按预期工作

标签 mysql sql phpmyadmin

我有两列整数类型,因此如果其中一列包含除“NULL”或“0”之外的任何数据,我想选择该行。

cola     colb    colc    cold
NULL       12     plo     123
12         0      hou     NULL
0          0      plo      0
0          0      hou      123
NULL       13     hou      231
NULL       0      plo      NULL

所以我只想选择 1,2,5 条记录 所以基本上我必须选择如果 colc 是 plo 那么 cola 或 colb 中的任何一种都应该有值(value),如果 colc 是 hou 那么 Cold 应该有值(value)。

我已经编写了一个查询,但它没有给出正确的结果

我给出了我的位置条件 哪里

IF ( cold = 'plo', cold, colc) IS NOT NULL 
AND IF ( cold = 'plo', cold, colc) <> '' 
AND ( ( (IF (colc <> 'plo', cola, colc) IS NOT NULL) 
    AND (IF (colc <> 'plo', cola, colc) <> '' )) 
       OR ( (IF (colc <> 'plo', colb, colc) IS NOT NULL) 
          AND (IF (colc <> 'plo', colb, colc) <> '' )) ) 

这是我的条件,但在应用此条件后,我也得到了两列均为 0 且 colc 为“plo”的结果

where子句有问题吗

最佳答案

谓词看起来比实际需要的复杂得多。

我不确定 colc 的值是什么与检查是否 cola 有关或colb包含一个非零整数值。

这就足够了:

   WHERE ( t.cola OR t.colb )

如果您有任何状况想要检查colc ,其中不等于 'plo''plot'

   WHERE ( t.cola OR t.colb )
     AND t.colc NOT IN ('plo','plot')
<小时/>

还有其他更复杂且更符合 ANSI 的表达式,可以实现等效的结果。

跟进

假设(不幸命名)列 cola , colbcolc是整数类型(或数字类型),你可以这样做:

  WHERE (t.colc = 'plo' AND (t.cola OR t.colb))
     OR (t.colc = 'hou' AND t.cold) 

编辑问题是为了澄清规范...查询应返回满足以下任一条件的行:

  • 如果 colc是 'plo' 则 cola 中的任何一个或colb应该具有除 0 以外的值或NULL

  • 如果 colc那么是“hou” cold应该具有除 0 以外的值或NULL

让我们稍微解开一下 WHERE 子句。

我们喜欢在所有 bool 值 AND 周围使用括号/OR表达式。这使得优先顺序变得明确。这应该可以帮助那些不知道/不记得是否 AND 的读者。或OR具有较高的优先级;使用括号,即使它们不是绝对必要的,也只是消除了一些可能的歧义,并使我们的意图更加清晰。

在 bool 上下文中,整数值计算结果为 NULL、FALSE 或 TRUE

  • 如果表达式的值为 NULL,则 bool 计算返回 NULL。
  • 如果表达式的值为 0(零),则计算结果为 bool 值 FALSE
  • 如果表达式的值不是 NULL 或 0,则计算结果为 bool 值 TRUE

SQL 三值 bool 逻辑,表达式 (a OR b)如果 a 则计算结果为 TRUE或b评估结果为 TRUE。

  OR    TRUE   FALSE  NULL
 -----  -----  -----  -----
 TRUE   TRUE   TRUE   TRUE 
 FALSE  TRUE   -      -
 NULL   TRUE   -      - 

AND运算符,表达式 (a AND b)a 两者的计算结果均为 TRUE和b评估为 TRUE。

重写

同样的 WHERE 子句:

  WHERE (t.colc = 'plo' AND (t.cola OR t.colb))
     OR (t.colc = 'hou' AND t.cold) 

可以重写为稍微更详细:

  WHERE (t.colc = 'plo' AND ((t.cola<>0) OR (t.colb<>0)))
     OR (t.colc = 'hou' AND t.cold<>0)

或者我们可以将其重写得更加复杂,但实际上没有必要这样做......这只会使破译变得更加困难。

关于mysql - 如果 mysql 中的条件未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30871993/

相关文章:

php - 在 phpmyadmin 中重置 ID

mysql - 在 mysql 数据库中归档年度数据的最佳方法

sql - 将具有重复值的数据插入 Postgresql

mysql - 按包含特定字段的记录数的顺序选择记录

mysql - 如何停止phpMyAdmin服务器监控?

php - phpMyAdmin 中的关系窗口是空白的

mysql 全文索引用于 MATCH() AGAINST 但不用于 =

mysql - Wordpress 不适用于 docker compose

mysql - SQL查询获取合并结果

MySQL 幻影表