我有两列整数类型,因此如果其中一列包含除“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
, 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 子句。
我们喜欢在所有 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/