SQL按位查询以提取多天的事件,同时遵守其他;过滤器“;
我正在尝试构建一个查询,该查询将根据一系列过滤器从数据库中提取事件:baseId、title、age和事件发生的天数 以下是到目前为止我得到的信息:SQL按位查询以提取多天的事件,同时遵守其他;过滤器“;,sql,sql-server-2008,Sql,Sql Server 2008,我正在尝试构建一个查询,该查询将根据一系列过滤器从数据库中提取事件:baseId、title、age和事件发生的天数 以下是到目前为止我得到的信息: SELECT * FROM [Events] WHERE BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5 AND (FreqType = 8 AND (FreqInterval & 2) = 2) OR (FreqType = 8
SELECT * FROM [Events]
WHERE BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5
AND (FreqType = 8 AND (FreqInterval & 2) = 2)
OR (FreqType = 8 AND (FreqInterval & 4) = 4)
从[事件]中选择*
其中BaseId=574,标题类似于“%occurs%”,MinAge=5
和(FreqType=8和(FreqInterval&2)=2)
或(FreqType=8和(FreqInterval&4)=4)
没有或线,它拉得很好。使用OR行,它不再关心BaseId、Title、MinAge和MaxAge列。是的,但只有在手术室。。。然后,它在OR之后提取所有匹配项(不管前面的and语句)
如何让查询按每个列过滤,然后按我想要的每个频率间隔过滤?我可能不止2,4。。。可以有1、2、4、8、16、32或64的任意组合
或者,有没有一种方法可以使用FreqInterval的和来执行
和(FreqType=8和(FreqInterval&6)=6)
?我不完全理解按位查询。这与按位逻辑无关。您只需修复WHERE
子句,就可以使用括号将两个位比较作为同一计算集的一部分:
...
AND (FreqType = 8 AND (FreqInterval & 2) = 2 OR
FreqInterval & 4) = 4))
您也不需要检查FreqType
两次,所以我为您简化了这一点
或
表示可以忽略任何先前的标准。把这个和另一个按位检查放在括号中意味着其中一个必须返回true。我认为这是一个优先问题。你正在做:
BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5 AND (FreqType = 8 AND (FreqInterval & 2) = 2)
OR
(FreqType = 8 AND (FreqInterval & 4) = 4)
BaseId=574,标题类似“%occurses%”,MinAge=5和(FreqType=8和(FreqInterval&2)=2)
或
(FreqType=8和(FreqInterval&4)=4)
尝试添加其他()
其中BaseId=574,标题类似“%occurrents%”,MinAge=5
和((FreqType=8和(FreqInterval&2)=2)或(FreqType=8和(FreqInterval&4)=4))
从[事件]中选择*
其中BaseId=574,标题类似于“%occurs%”,MinAge=5
和((FreqType=8和(FreqInterval&2)=2)
或(FreqType=8和(FreqInterval&4=4))
添加括号:
SELECT * FROM [Events]
WHERE BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5
AND
(
(FreqType = 8 AND (FreqInterval & 2) = 2)
OR (FreqType = 8 AND (FreqInterval & 4) = 4)
)
正如你的建议,这几乎是正确的,但这里有一个正确的建议:
(FreqType = 8
AND (FreqInterval & 6) <> 0 )
你可以把那些
或放在相同的条件下<代码>和((FreqType=8和(FreqInterval&2)=2)或(FreqType=8和(FreqInterval&4)=4)或……)
感谢您花了额外的时间解释这一点,真的很有帮助。
SELECT * FROM [Events]
WHERE BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5
AND
(
(FreqType = 8 AND (FreqInterval & 2) = 2)
OR (FreqType = 8 AND (FreqInterval & 4) = 4)
)
(FreqType = 8
AND ( (FreqInterval & 2) = 2 OR (FreqInterval & 4) = 4) )
)
(FreqType = 8
AND (FreqInterval & 6) <> 0 )
SELECT * FROM [Events]
WHERE
(
BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5
AND (FreqType = 8 AND (FreqInterval & 2) = 2)
)
OR
(FreqType = 8 AND (FreqInterval & 4) = 4)
(FreqType = 8 AND (FreqInterval & 6) <> 0 )