TSQL Where Statement OR + AND

时间:2016-01-26 05:40:19

标签: tsql stored-procedures sql-server-2012

我有一个非常基本的SELECT声明让我感到悲伤。

我有一个主要的工具表,我从中选择数据。在该表格中,我只想要status不是Decommissioned的工具。

从那里开始,我正在根据我的LIKE子句检查工具名称,看它是否匹配。这是为我的AJAX typeahead完成的。

最后,它正在加入一个名为akas的表,其中包含的工具名称也可用于引用主工具。这些基本上是工具的其他别名。

我面临的问题是它仍然包含Decommissioned状态的记录。我很确定它是WHERE条款..有什么想法吗?

   SELECT   t.toolName,
             t.tool AS toolID,
             t.toolType,
             t.toolStatus,
             e1.PreferredName AS ownerFirst,
             e1.LastName AS ownerLast,
             e1.NTID AS ownerNTID
    FROM     dbo.ti_tools AS t
             LEFT OUTER JOIN
             dbo.ti_toolAKAs AS a
             ON t.tool = a.tool
             LEFT OUTER JOIN dbo.EmployeeTable AS e1
             ON t.toolOwner = e1.QID
    WHERE    (t.toolName LIKE '%' + @tool + '%') OR (a.aka LIKE '%' + @tool + '%')
             AND t.toolStatus <> 'Decommissioned'
    ORDER BY t.toolName ASC
    FOR      XML PATH ('tools'), TYPE, ELEMENTS, ROOT ('root');

2 个答案:

答案 0 :(得分:1)

添加圆括号:

SELECT   t.toolName,
             t.tool AS toolID,
             t.toolType,
             t.toolStatus,
             e1.PreferredName AS ownerFirst,
             e1.LastName AS ownerLast,
             e1.NTID AS ownerNTID
FROM dbo.ti_tools AS t
LEFT OUTER JOIN dbo.ti_toolAKAs AS a
  ON t.tool = a.tool
LEFT OUTER JOIN dbo.EmployeeTable AS e1
  ON t.toolOwner = e1.QID
WHERE ((t.toolName LIKE '%' + @tool + '%') OR (a.aka LIKE '%' + @tool + '%'))
  AND t.toolStatus <> 'Decommissioned'
ORDER BY t.toolName ASC
FOR XML PATH ('tools'), TYPE, ELEMENTS, ROOT ('root');

案件非常简单:

cond1 OR cond2 AND cond3
<=>
cond1 OR (cond2 AND cond3)

您获得的记录仅满足cond1。你真正想要的是:

(cond1 OR cond2) AND cond3

答案 1 :(得分:1)

运营顺序

AND更高优先级高于OR

WHERE子句更改为以下内容,使用两个OR条件左右的括号将它们与佣金检查逻辑分开:

WHERE ((t.toolName LIKE '%' + @tool + '%') OR (a.aka LIKE '%' + @tool + '%'))
         AND t.toolStatus <> 'Decommissioned'

您的原始WHERE子句的评估与此相同:

WHERE (t.toolName LIKE '%' + @tool + '%') OR
      ((a.aka LIKE '%' + @tool + '%') AND t.toolStatus <> 'Decommissioned')