![](/img/trans.png)
[英]MySQL AFTER DELETE trigger if condition is not working as expected
[英]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
的值与检查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
, colb
和colc
(不幸的是)列是整数类型(或数字类型),则可以执行以下操作:
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子句进行一些解压缩。
我们喜欢在所有布尔AND
/ OR
表达式周围使用parens。 这使得优先顺序明确。 这应该可以帮助不知道/不记得AND
或OR
优先级较高的读者; 即使在并非绝对必要的地方使用parens,也可以消除一些可能的歧义,并使我们的意图更加明确。
在布尔上下文中, 整数值的取值为NULL,FALSE或TRUE
如果a
或b
计算结果为TRUE,则SQL三值布尔逻辑表达式(a OR b)
计算结果为TRUE。
OR TRUE FALSE NULL
----- ----- ----- -----
TRUE TRUE TRUE TRUE
FALSE TRUE - -
NULL TRUE - -
使用AND
运算符,表达式(a AND b)
仅将a
和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)
或我们可以重写它以使其更令人费解,但实际上并不需要这样做……这只会使解密变得更加困难。
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.