WHERE子句中的AND / OR混合会导致意外结果

时间:2013-10-11 14:05:10

标签: sql sql-server sql-server-2008

我正在尝试使用该声明显示1999年,2000年和2001年发布的超过三小时的所有电影(实际列以秒为单位)。

输出表显示正确的年份,但它显示除了movie之外的title_type的其他内容,并且它在title_runtime_hrs中显示少于三(以及大于三)的时间。

这是我的代码:

select title_name, title_type, title_release_year, 
    (title_runtime / 3600.0) as title_runtime_hrs
from nf_titles
where title_type = 'Movie' and
    title_runtime > 3 and
    title_release_year = '1999' or
    title_release_year = '2000' or
    title_release_year = '2001' 
order by title_release_year, title_runtime_hrs desc

3 个答案:

答案 0 :(得分:5)

或者这样做

select title_name, title_type, title_release_year, (title_runtime / 3600.0) as title_runtime_hrs
from nf_titles
where title_type = 'Movie' and
    title_runtime > 3 and
    title_release_year in ('1999','2000','2001')
order by title_release_year, title_runtime_hrs desc

答案 1 :(得分:3)

您需要将OR语句包装在括号中。否则SQL Server会说“好的,这是2000年,我们已经达到了标准。

select title_name, title_type, title_release_year, (title_runtime / 3600.0) as title_runtime_hrs
from nf_titles
where title_type = 'Movie' and
    title_runtime > 3 and
    (title_release_year = '1999' or
    title_release_year = '2000' or
    title_release_year = '2001' )
order by title_release_year, title_runtime_hrs desc

答案 2 :(得分:2)

您可能需要围绕OR语句使用括号(这是因为ANDOR更强约束):

select title_name, title_type, title_release_year, (title_runtime / 3600.0) as title_runtime_hrs
from nf_titles
where title_type = 'Movie' and
    title_runtime > 3 and
    (
        title_release_year = '1999' or
        title_release_year = '2000' or
        title_release_year = '2001' 
    )
order by title_release_year, title_runtime_hrs desc