【问题标题】:What's a better way of saying `col1 < IFNULL(col2, 999999)` and `ORDER BY IFNULL(col3, 999999)`?`col1 < IFNULL(col2, 999999)` 和 `ORDER BY IFNULL(col3, 999999)` 有什么更好的说法?
【发布时间】:2018-02-08 18:47:39
【问题描述】:

如果我使用的是过程编程语言,我会使用类似 sys.MAX_INT 的东西来代替 999999。SQL 中是否存在这样的东西?或者有没有更简洁的方法来摆脱这条 SQL 中的 999999?

SELECT 
     * 
FROM 
    tbl1 
WHERE 
    col1 < IFNULL(col2, 999999) 
ORDER BY 
    IFNULL(col3, 999999);

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以使用~0 代替“MAX_INT”

    请检查这个答案。

    In SQL how do I get the maximum value for an integer?

    你的情况……

    SELECT 
         * 
    FROM 
        tbl1 
    WHERE 
        col1 < IFNULL(col2, ~0) 
    ORDER BY 
        IFNULL(col3, ~0);
    

    【讨论】:

    • 如果该值已签名,则不会。
    • @GordonLinoff 为什么?
    • @shmosel 。 . .我认为 ~0 是一个负数。
    • @GordonLinoff 我不这么认为。 AFAIK,所有按位运算都返回 UNSIGNED BIGINT。
    【解决方案2】:

    您的代码相当于:

    select t.*
    from tb1 t
    where col1 < col2 or col2 is null
    order by (col3 is not null) desc, col3;
    

    【讨论】:

    • 使用is null 比使用IFNULL() 有效率提升吗?
    • ORDER BY -col3 DESC
    • col3 is null 等价于(col3 is not null) desc
    • @SterlingArcher 我认为会有,因为 IFNULL() 提供了隐含条件的“分支”,而 IS NULL 只是一个条件。 IFNULL 隐式执行 IS NULL 检查,然后决定是否返回不同的值。但是,既然您提到它,而 IS NULL 几乎可以肯定比 IFNULL(); 快。如果二维而不是一个维度的排序否定了任何效率提升,我不能肯定。
    • @SterlingArcher 。 . .差异可以忽略不计,因为此查询不会使用索引。最重要的区别是is null是ANSI标准语法。
    猜你喜欢
    • 2010-12-14
    • 2018-10-13
    • 2022-06-15
    • 1970-01-01
    • 2014-09-21
    • 2014-09-22
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多