SQL使用多个AND&或在同一个查询中

时间:2016-04-17 17:25:00

标签: sql sql-server conditional-statements

从我的查询中获得正确结果时遇到问题。

我的主要问题是我有一个名为filterlist的列,其中包含此格式的数据[space]NUMBER[space]

 | 2 | 16 | 7 |

我需要使用此Where语句选择与我的第一个查询匹配的所有产品 -

WHERE     
    (dept = '5') AND (active = 1) AND (Manufacturer = 'A Company')

然后我需要添加以下内容以查找列filterlist包含任何字符串值[space]NUMBER[space]使用 -

的记录
(CHARINDEX(' 2 ', filterlist) > 0) OR (CHARINDEX(' 3 ', filterlist) > 0) 
OR (CHARINDEX(' 64 ', filterlist) > 0)

我尝试过的完整SQL是

SELECT * 
FROM products 
WHERE 
    ((dept = '5') AND (active = 1) AND (Manufacturer = 'A Company')) 
    AND ((CHARINDEX(' 3 ', filterlist) > 0) OR 
         (CHARINDEX(' 34 ', filterlist) > 0) OR 
         (CHARINDEX(' 64 ', filterlist) > 0))

所以我希望得到所有记录,其中dept为5,处于活动状态,由'A Company'制作,并且列filterlist包含3,34或64(作为示例)

更新:这部分一切正常:

WHERE 
((dept = '5') AND (active = 1) AND (Manufacturer = 'A Company')) 
AND ((CHARINDEX(' 3 ', filterlist) > 0)

但在添加此部分时从错误的部门/制造商处提取其他记录

 OR 
     (CHARINDEX(' 34 ', filterlist) > 0) OR 
     (CHARINDEX(' 64 ', filterlist) > 0))

如果有人能指出我如何做到这一点,我将非常感激。

2 个答案:

答案 0 :(得分:1)

  1. 您能考虑将数字字段保存在数字类型中吗?
  2. 如果不可能,那么你可以使用这个

    SELECT *
    FROM products 
    WHERE ((dept = '5') AND (active = 1) AND (Manufacturer = 'A Company')) 
     AND ltrim(rtrim(filterlist)) in ('3','34','64')
    

答案 1 :(得分:0)

感谢您创建SQLFiddle。此查询返回具有“公司”的两行。所以我认为它是正确的(我删除了dept,因为它不在products中,但是在这个示例中没有区别,因为我们仍然有相同的逻辑组合,只少一个)。

SELECT * 
FROM products 
WHERE 
    ((active = 1) AND (Manufacturer = 'A Company')) 
    AND ((CHARINDEX(' 3 ', filterlist) > 0) OR 
         (CHARINDEX(' 34 ', filterlist) > 0) OR 
         (CHARINDEX(' 64 ', filterlist) > 0))

此外,当我更改为Manufacturer = 'B Company'时,我只获得了第三条记录。

这对我有意义......我错过了什么吗?