我正在尝试从数据库中选择数据,但是遇到了麻烦,我确定它很简单,虽然我没看到,但我无法弄清楚。
一个表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以上)的地方时,您可以确信自己的模式设计不是最佳的。