我正在尝试在Teredata中使用OR条件

时间:2019-09-13 08:04:48

标签: sql teradata

这是我的病情

代码:

Select * 
from table_name 
where col1 is not null
or (col1 is null and col2 = 1) 
and Col3 in (1,2,3,4);

这对我不起作用,仅当我在Bracket中使用Condition时才起作用 代码:

Select * 
from table_name 
where (
  col1 is not null or 
  (col1 is null and col2 = 1)   
)
and Col3 in (1,2,3,4);

任何人都可以帮助了解OR条件的工作原理吗?

2 个答案:

答案 0 :(得分:0)

我怀疑虽然查询确实在运行,但是它不会生成您期望的结果集。尝试添加更有意义的括号:

SELECT *
FROM table_name
WHERE
    (col1 IS NOT NULL OR col2 = 1) AND
    col3 IN (1,2,3,4);

col1上的null校验和col2上的备份校验似乎在一起,因此它们都应放在括号内。并不是说您不需要检查col1 IS NULL,因为如果非null检查失败,它将自动意味着col1为null。

答案 1 :(得分:0)

每当您在AND子句中混合使用ORWHERE而没有括号时,您就容易陷入麻烦。像这样使用OR有效地使AND无效,将会为您带来意想不到的结果。

OR检查仅意味着返回“左”条件或“右”条件的值为TRUE的行。对于没有括号的情况,如果OR条件的值为TRUE,则查询将始终返回行,并且将忽略AND col3 IN (...)检查。

我猜你想要更多这样的东西:

SELECT *
FROM table_name
WHERE (
  col1 IS NOT NULL OR
  (col1 IS NULL AND col2 = 1)
)
AND col3 IN (1,2,3,4);

这将加强col1周围的逻辑,同时保留col3上的过滤器。