如果mysql中的条件不能按预期工作

时间:2015-06-16 15:30:54

标签: 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然后任何一个可乐或者colb应该有价值,如果colc是hou,那么cold应该有价值。

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

我正在给我的条件

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子句

是否有问题

2 个答案:

答案 0 :(得分: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是&#39; plo&#39;那么colacolb中的任何一个都应具有0NULL

  • 以外的值
  • 如果colc是&#39;则&#39;那么cold应该具有0NULL

  • 以外的值

让我们稍微解压WHERE子句。

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

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

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

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

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

使用AND运算符,表达式(a AND b)仅在ab评估为TRUE时评估为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)

或者我们可以重写那些更复杂的内容,但这并不是真的有必要这样做......这会让解密变得更难。

答案 1 :(得分:0)

NOT(((cola IS NULL) OR (cola=0)) AND ((colb IS NULL) OR (colb=0))) AND colc<>'plo'

让你2,4 - 关于colc plo不在你的定义中,但是在代码中