Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL按位查询以提取多天的事件,同时遵守其他;过滤器“;_Sql_Sql Server 2008 - Fatal编程技术网

SQL按位查询以提取多天的事件,同时遵守其他;过滤器“;

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

我正在尝试构建一个查询,该查询将根据一系列过滤器从数据库中提取事件: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 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 )