【问题标题】:If condition in mysql not working as expected如果 mysql 中的条件未按预期工作
【发布时间】:2015-09-01 12:46:12
【问题描述】:

我有两列是整数类型,所以如果其中一列有除“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 中的任何一个都应该有价值,如果 colc 是 hou 那么冷应该有价值。

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

我给出了我的 where 条件

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) <> '' )) ) 

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

where子句有问题吗

【问题讨论】:

  • 我得到的答案不是我想要的
  • 谓词看起来方式比它们需要的复杂。对您的问题的编辑使您更清楚您要实现的目标。根据对您问题的修改,我已在之前的回答中添加了后续内容。

标签: mysql sql phpmyadmin


【解决方案1】:

谓词看起来比它们需要的复杂得多。

我不确定colc 的值与检查colacolb 是否包含非零整数值有什么关系。

这就足够了:

   WHERE ( t.cola OR t.colb )

如果您有某些情况要检查colc,其中不等于'plo''plot'

   WHERE ( t.cola OR t.colb )
     AND t.colc NOT IN ('plo','plot')

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

跟进

假设(不幸命名的)列colacolbcolc 是整数类型(或数字类型),您可以执行以下操作:

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

对问题进行了编辑以阐明规范...查询应返回满足以下任一条件的行:

  • 如果colc 是“plo”,那么colacolb 中的任何一个都应具有0NULL 以外的值

  • 如果colc 是“hou”,那么cold 的值应不同于0NULL

让我们稍微解开 WHERE 子句。

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

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

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

如果ab 的计算结果为TRUE,则SQL 三值布尔逻辑表达式(a OR b) 的计算结果为TRUE。

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

使用AND 运算符,表达式(a AND b) 的计算结果只有ab 的计算结果为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 新手觉得有点奇怪。
【解决方案2】:
NOT(((cola IS NULL) OR (cola=0)) AND ((colb IS NULL) OR (colb=0))) AND colc<>'plo'

得到你 2,4 - 关于 colc 的一点是 plo 不在你的定义中,但在代码中

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 2014-01-07
    • 2021-12-13
    • 2020-05-14
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多