我有两列是整数类型的列,所以如果其中一列有“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子句
是否有问题答案 0 :(得分:1)
谓词看起来比他们需要的更复杂。
我不确定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
是&#39; plo&#39;那么cola
或colb
中的任何一个都应具有0
或NULL
如果colc
是&#39;则&#39;那么cold
应该具有0
或NULL
让我们稍微解压WHERE子句。
我们喜欢在所有布尔AND
/ OR
表达式周围使用parens。这使得优先顺序显式化。这应该有助于那些不知道/不记得AND
或OR
是否具有更高优先级的读者;使用parens,即使它们并非严格必要,也只是消除了一些可能的歧义,并使我们的意图更加明确。
在布尔上下文中,整数值的计算结果为NULL,FALSE或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)
仅在a
和b
评估为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不在你的定义中,但是在代码中