繁体   English   中英

如果mysql中的条件无法按预期工作

[英]If condition in mysql not working as expected

我有两列为整数类型,因此如果其中之一具有除“ 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,那么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子句有什么问题吗

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

我不确定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表达式周围使用parens。 这使得优先顺序明确。 这应该可以帮助不知道/不记得ANDOR优先级较高的读者; 即使在并非绝对必要的地方使用parens,也可以消除一些可能的歧义,并使我们的意图更加明确。

在布尔上下文中, 整数值的取值为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)

或我们可以重写它以使其更令人费解,但实际上并不需要这样做……这只会使解密变得更加困难。

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

让你2,4 - 约COLC是巴解组织在您的定义不是钻头,而是在代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM