我正在尝试从数据库中选择数据,但是遇到了麻烦,我确定它很简单,虽然我没看到,但我无法弄清楚。

一个表jobs具有5个字段:job_id,job_status,job_schedulestatus,job_schedulestatus2,job_schedulestatus3。 id是一个自动递增的数字,状态可以有两个值Active或Invoiced,并且计划状态可以包含从下拉列表中选择的大量值,但在这种情况下,我只想关注称为FOC的值,已取消并采样。

我想做的是在计划状态1-3中选择设置为活动且未设置FOC,已取消或样本的所有值

这是我的选择语句:

SELECT job_id, job_status, job_schedulestatus, job_schedulestatus2, job_schedulestatus3
FROM jobs WHERE job_status='Active'
AND ( job_schedulestatus!='FOC' OR job_schedulestatus!='Cancelled' OR job_schedulestatus!='Sample' )
OR ( job_schedulestatus2!='FOC' OR job_schedulestatus2!='Cancelled' OR job_schedulestatus2!='Sample' )
OR ( job_schedulestatus3!='FOC' OR job_schedulestatus3!='Cancelled' OR job_schedulestatus3!='Sample' )
ORDER BY job_id DESC;


这仍然显示所有具有FOC,已取消或样本的字段。现在,如果我删除!=并仅替换为=,它将仅显示FOC,已取消或采样的内容,这向我提示使用!=存在问题。我尝试使用<>替换,但仍然无法正常工作。

如果仅通过检查计划状态对其进行测试,则它的工作原理如下:

SELECT job_id, job_status, job_schedulestatus, job_schedulestatus2, job_schedulestatus3
FROM jobs WHERE job_status='Active' AND job_schedulestatus!='Cancelled
ORDER BY job_id DESC;


有任何想法吗?

提前致谢

最佳答案

这似乎更容易处理:

SELECT job_id
     , job_status
     , job_schedulestatus
     , job_schedulestatus2
     , job_schedulestatus3
  FROM jobs
 WHERE job_status = 'Active'
   AND
     ( job_schedulestatus  NOT IN ('FOC','Cancelled','Sample')
    OR job_schedulestatus2 NOT IN ('FOC','Cancelled','Sample')
    OR job_schedulestatus3 NOT IN ('FOC','Cancelled','Sample')
     )
 ORDER
    BY job_id DESC;


请注意,通常,在发现带有枚举列(例如2以上)的地方时,您可以确信自己的模式设计不是最佳的。

10-04 10:55