【问题标题】:SQL Select with multiple AND and OR's具有多个 AND 和 OR 的 SQL 选择
【发布时间】:2012-08-18 18:16:55
【问题描述】:

我正坐在一个逻辑问题上,我只是越来越困惑自己。

示例表

标识 |客户 ID |任务 |已确认 |取消 |完成

1 | 20 |正文 | 1 | 0 | 0
2 | 20 |正文 | 1 | 1 | 0
3 | 20 |正文 | 1 | 0 | 1
4 | 17 |正文 | 0 | 1 | 0
5 | 17 |正文 | 1 | 0 | 0
6 | 20 |正文 | 1 |空 |空
7 | 20 |正文 | 0 | 1 |空

我希望选择 custID = 20 的所有任务并确认 =1。如果任务被取消=1或完成=1,则不返回记录。

在这种情况下,返回的行将是 1 和 6。

到目前为止我的查询是

SELECT *
FROM table1
WHERE    
 (CustID = 20 AND Confirmed = 1 AND Cancelled <> 1 AND Completed <> 1) OR
 (CustID = 20 AND Confirmed = 1 AND Cancelled = 1 AND Completed <> 1) OR
 (CustID = 20 AND Confirmed = 1 AND Cancelled <> 1 AND Completed = 1)

任何帮助将不胜感激。

【问题讨论】:

    标签: sql-server-2008 select where


    【解决方案1】:
    SELECT * FROM thk_basvuru WHERE thk_status in (8,23,33) or thk_olo_status not in (4,6,9,11,12)
    

    【讨论】:

      【解决方案2】:

      您可以将其简化为:

      SELECT * FROM table1
      WHERE CustID = 20
        AND Confirmed = 1
        AND (Cancelled <> 1 OR Cancelled IS NULL)
        AND (Completed <> 1 OR Completed IS NULL)
      

      在将实数与 NULL 进行比较时,您必须小心(并且非常明确),因为等式和不等式都将它们排除在外。

      【讨论】:

        【解决方案3】:
        SELECT *
        FROM table1
        WHERE    
            CustID = 20 AND Confirmed = 1 AND NOT (Cancelled = 1 OR Completed = 1)  
        

        【讨论】:

        • 也可以,只需要像上面的解决方案一样包括检查NULL,谢谢!
        猜你喜欢
        • 2011-04-04
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        相关资源
        最近更新 更多