SQL Servr:如何使用很多WHERE和AND语句

时间:2016-01-15 03:36:25

标签: sql sql-server sql-server-2008

我有下表:

片剂:

+--------+------+------+------+------+
| DataID | ColD | ColS | Col3 |Col4  |
+--------+------+------+------+------+
|      1 | A    | E    | Y    |  Z   |  
|      2 | B    | F    | Y    |  Z   |      
|      3 | C    | G    | Y    |  Z   |   
|      4 | B    | E    | Y    |  Z   |     
|      5 | T    | G    | Y    |  Z   | 
+--------+------+------+------+------+

我的问题是:我如何获取所有列

    ColD = A OR B 
    AND ColS = E OR F 
    OR ColD = C 
    AND ColS = 'G' 
    AND col3 = 'Y' 
    AND col4 = 'Z'

解决方案:

SELECT *
WHERE   (ColD IN ( 'A', 'B') 
                 AND ColS IN ( 'E', 'F' ) 
                 AND Col3 = 'Y' 
                 AND Col4 = 'Z')
              OR (ColD = 'C'
                 AND ColS = 'G' 
                 AND Col3 = 'Y' 
                 AND Col4 = 'Z')

问题:如果您想知道如何获得上述解决方案,您会如何询问它以便更容易理解?

谢谢大家的帮助。

2 个答案:

答案 0 :(得分:3)

如果我正确读到这一点,这是一个非常基本的逻辑结构。关键是使用or分隔备选条件。

你提供的列表非常直接地翻译(有很多假设):

WHERE  ( cold = 'A' 
         AND cols IN ( 'E', 'F' ) ) 
        OR ( cold = 'B' 
             AND cols IN ( 'F', 'E' ) ) 
        OR ( cold = 'C' 
             AND cols = 'G' 
             AND col3 = 'Y' 
             AND col4 = 'Z' ) 

然而,从实际情况来看,它可以简化一点:

WHERE  ( cold IN ( 'A', 'B' ) 
         AND cols IN ( 'E', 'F' ) ) 
        OR ( cold = 'C' 
             AND cols = 'G' 
             AND col3 = 'Y' 
             AND col4 = 'Z' )

正如paulsm4所说,你需要更多的括号。现在你的问题的措辞方式(没有括号),我们无法确定评估条件的顺序(当你混合andor时这很重要)。如果我们无法弄清楚相应的顺序,那么软件肯定不行。将括号括在个别操作(即(t.col3 = 'Y'))是没有意义的;它没有表明你需要的顺序。

根据您的最新编辑,似乎您可能希望始终强制执行条件col3 = 'Y' AND col4 = 'Z'。如果是这种情况,则条件可能如下所示:

WHERE  ( ( cold IN ( 'A', 'B' ) 
           AND cols IN ( 'E', 'F' ) ) 
          OR ( cold = 'C' 
               AND cols = 'G' ) ) 
       AND col3 = 'Y' 
       AND col4 = 'Z' 

答案 1 :(得分:2)

试试这个:

SELECT * FROM data 
WHERE (colD = 'A' OR colD = 'B') AND (colS = 'E' or colS = 'F') 
OR (colD = 'C' AND colS = 'G' AND col3 = 'Y' AND col4 = 'Z')

使用提供的示例数据,得出以下结果:

DataID    colD    colS    col3    col4
   1        A       E      Y       Z
   2        B       F      Y       Z
   3        C       G      Y       Z
   4        B       E      Y       Z

正如其他人所说,关键是将你想要的内容翻译成布尔术语。