【问题标题】:Sql statement condition in where Clausewhere子句中的sql语句条件
【发布时间】:2017-12-13 08:49:09
【问题描述】:

我在为以下 sql 查询创建 where 语句条件时遇到问题。

我希望添加一个 where 条件,如果 num1 和 num2 值都等于 0 或什至其中任何一个也等于 0,则不显示值

SELECT Num1, Num2
FROM Position
WHERE  (Num1 IS NOT NULL AND Num2 IS > NOT NULL)
ORDER BY PositionDateTime DESC ;

结果:

    +---------+---------+
    | Num1    | Num2    |
    +---------+---------+
    |
    | 47.3941 | 8.68005 |
    |       0 |       0 |
    | 47.4385 | 8.61106 |
    | 47.4385 | 8.61106 |

【问题讨论】:

  • 看似很简单的要求,有什么问题?
  • 我只想在 num1 和 num2 都不等于零或其中任何一个也不等于零的条件下添加 sql 语句
  • 只需where num1 > 0 and num2 > 0。
  • @jarlh,-9 呢?
  • @HoneyBadger,无论如何,找不到该行。 where num1 <> 0 and num2 <> 0.

标签: mysql sql mariadb


【解决方案1】:

试试这个:

 SELECT Num1, Num2 
    FROM Position 
    WHERE Num1 <> 0  
    OR Num2 <> 0
    ORDER BY PositionDateTime DESC ;

【讨论】:

    【解决方案2】:

    您可以使用IFNULL:

    SELECT Num1, Num2 
    FROM Position 
    WHERE IFNULL(Num1, 0) <> 0 AND IFNULL(Num2, 0) <> 0
    ORDER BY PositionDateTime DESC
    

    演示: http://sqlfiddle.com/#!9/3a441a/1/0

    解释:如果两个值(Num1 和 Num2)都为 0(或 NULL)或其中一个值,您不想显示一行这些值(Num1 或 Num2)为 0(或 NULL)。因此,您只想显示两个值(Num1 和 Num2)的值不等于 0(和 NULL)的行。所以你可以使用Num1 &lt;&gt; 0 AND Num2 &lt;&gt; 0 作为条件。要为 NULL 设置默认值,您可以使用 IFNULL(第二个参数是用于代替 NULL 的值)。在 MySQL 中,IFNULL(Num1, 0) &lt;&gt; 0 AND IFNULL(Num2, 0) &lt;&gt; 0 和 Num1 &lt;&gt; 0 AND Num2 &lt;&gt; 0 之间应该没有区别

    扩展演示: http://sqlfiddle.com/#!9/11f2a5/1/1

    【讨论】:

    • 它可以根据我的需要完美运行。但是你能解释一下吗..我不明白那个表达是如何工作的
    【解决方案3】:

    您可以使用直接的&lt;&gt; 运算符:

    SELECT   Num1, Num2 
    FROM     Position
    WHERE    Num1 IS NOT NULL AND Num1 <> 0 AND
             Num2 IS NOT NULL AND Num2 <> 0
    ORDER BY PositionDateTime DESC
    

    您也可以使用coalesce 使查询更加优雅,尽管这可能是个人喜好问题:

    SELECT   Num1, Num2 
    FROM     Position
    WHERE    COALESCE(Num1, 0) <> 0 AND
             COALESCE(Num2. 0) <> 0
    ORDER BY PositionDateTime DESC
    

    【讨论】:

    • 你可以跳过 NOT NULL 的东西。 &lt;&gt; 0 仅适用于非空值。
    • 为了性能,无论如何都不建议在where 子句中使用函数。
    • 它是否对 num1 和 num2 起作用,要么都为零,要么其中任何一个也为零
    • @tomtom 查看and 逻辑运算符的用法。如果其中任何一个是0,则不会返回该行。
    【解决方案4】:

    您可以简单地将查询更改为:

    SELECT num1, num2
    FROM position
    WHERE num1 <> 0 AND num2 <> 0
    ORDER BY positiondatetime DESC ;
    

    【讨论】:

      【解决方案5】:

      尝试:其中 Num10 和 Num20

      【讨论】:

        【解决方案6】:
        SELECT Num1, Num2 
        FROM Position 
        WHERE (Num1 is not null and Num2 is not null)
        ORDER BY PositionDateTime DESC
        

        【讨论】:

          【解决方案7】:
              SELECT Num1, Num2 
              FROM Position WHERE Num1 <> 0 AND Num1 IS NOT NULL AND Num1 <> ''
              AND Num2 <> 0 AND Num2 IS NOT NULL AND Num2 <> ''
              ORDER BY PositionDateTime DESC ;
          

          【讨论】:

          • 虽然你的代码可以解决问题,但也请解释一下原因。
          猜你喜欢
          • 1970-01-01
          • 2011-08-21
          • 1970-01-01
          • 2022-01-14
          • 2013-03-08
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          相关资源
          最近更新 更多