【问题标题】:How do I form an SQL query with AND and ORs?如何使用 AND 和 OR 形成 SQL 查询?
【发布时间】:2013-02-05 16:41:44
【问题描述】:

我想编写一个查询,返回 X 列中的所有非空单元格且其值不是 2、5 或 8。我这样做对吗?因为我的结果肯定看起来不对。

SELECT *
FROM [Example].[dbo].[table]
WHERE X <> '' AND (X <> '2' OR X <> '5' OR X <> '8');  

【问题讨论】:

  • 也许我没有以正确的方式捕捉空单元格?
  • 列是否允许为空?
  • X &lt;&gt; '2' OR X &lt;&gt; '5' OR X &lt;&gt; '8' 表示如果它与其中任何一个不同,那就是真的。由于很难不存在(例如,如果 X=2,它仍然不同于 5 和 8),因此带括号的表达式始终为真(除非涉及 NULL,这似乎不是本意)
  • @Joachim 感谢您帮助我更好地理解逻辑。我显然错了。

标签: sql sql-server-2008 select


【解决方案1】:

空,你的意思是NULL (nothing) 和empty string 不等于null 所以你应该使用特殊条件来过滤掉非NULL 值使用 IS NOT NULL

WHERE X IS NOT NULL AND 
      X NOT IN('', '2', '5', '8'); 

【讨论】:

    【解决方案2】:
    SELECT *
    FROM [Example].[dbo].[table]
    WHERE X <> '' AND  X IS NOT NULL AND X NOT IN ('2','5','8')
    

    【讨论】:

      【解决方案3】:

      就我个人而言,我会这样写:

      SELECT *
      FROM [Example].[dbo].[table]
      WHERE ISNULL(X,'') <> ''
      AND X not in ('2','5','8'); 
      

      【讨论】:

        【解决方案4】:

        您没有在此查询中考虑 NULLS。

        X IS NOT NULL
        

        我会拿出你的“或”,然后按照你想要的所有这些标准做,而不是一个或另一个。

        【讨论】:

        • 废话,你是对的。我没有意识到将所有这些 ors 更改为 ands 可以达到我想要的结果(除了 null/empty 的东西)。感谢您指出这一点,+1。
        • 在 SQL 中,您必须始终注意 NULL。当您忽略它们时,它们有时会扼杀您的陈述,因此最好尽可能记住它们。就像很多人已经表明的那样,当列出一堆你想要排除的东西时,我会使用“In”或“Not in”。恕我直言,看起来更干净。
        【解决方案5】:

        似乎所有其他答案都集中在明确过滤掉NULL,但我想我会指出NULL 是一个特例,NULL NOT IN 任何事情都不是真的。这会将您的查询简化为;

        SELECT * FROM myTable WHERE X NOT IN ('', '2','5','8')
        

        这将选择 X 不是 NULL、'2'、'5'、'8' 或空字符串的所有行。

        如果你想要NULL 包含,你必须做一些奇怪的构造;

        SELECT * FROM myTable WHERE X IS NULL OR X NOT IN ('', '2', '5', '8');
        

        An SQLfiddle to test with.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-25
          • 1970-01-01
          • 1970-01-01
          • 2020-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多