【问题标题】:Ampersand (&) operator in a SQL Server WHERE ClauseSQL Server WHERE 子句中的与号 (&) 运算符
【发布时间】:2017-11-06 05:53:03
【问题描述】:

对不起,这个非常基本的问题。 & 操作符在这条 SQL 中做了什么

WHERE (sc.Attributes & 1) = 0 

sc 是包含attributes 列的表的别名。

我正在尝试了解报告中的一些 SQL,并且该行使其返回 0 个条目。如果我将其注释掉,它会起作用。我的 SQL 知识有限,我不确定 & 1 在做什么。

【问题讨论】:

    标签: sql-server tsql bitwise-operators


    【解决方案1】:

    & is the bitwise logical and operator - 它对 2 个整数值执行操作。

    WHERE (sc.Attributes & 1) = 0 
    

    上面的代码检查 sc.Attributes 是否为偶数。这与说第一位未设置相同。

    由于列的名称:“属性”,那么“1”值可能只是一些具有某些外部含义的标志。

    对于存储在属性数字中的每个标志,通常使用 1 个二进制数字。所以要测试你使用 sc.Attributes&1 的第一位,测试你使用 sc.Attributes&2 的第二位,测试你使用 sc.Attributes&4 的第三位,测试你使用 sc.Attributes&8 的第四位,...

    = 0 部分正在测试是否未设置第一位。

    一些二进制示例:(== 显示运算结果)

    //Check if the first bit is set, same as sc.Attributes&1
    11111111 & 00000001 == 1
    11111110 & 00000001 == 0
    00000001 & 00000001 == 1
    
    
    //Check if the third bit is set, same as sc.Attributes&4
    11111111 & 00000100 == 1
    11111011 & 00000100 == 0
    00000100 & 00000100 == 1
    

    【讨论】:

    • 我认为您的意思是 11111111 & 00000100 == 100(或十进制的 4)
    【解决方案2】:

    这是bitwise and

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        看到您将其标记为 sql server,我想我会从不同的角度添加一些东西,因为这周也遇到了其中一个。

        如果在谓词中使用,这些可能会损害查询的性能。很容易制造自己的例子。这是我的查询中的 sn-p

        WHERE
        advertiserid = @advertiserid
        AND (is_deleted & @dirty > 0)
        
        WHERE
        advertiserid = @advertiserid
        AND (is_deleted > 0 AND @dirty > 0)
        

        通过简单地为每一列定义一个适当的值,这允许优化器删除书签查找,性能统计数据显示了 X10 的性能提升。

        【讨论】:

        • 列上的所有数学运算都是不可分割的。不仅仅是一点数学。
        • 但我认为按位的代码路径更快 - 直接进入 C/C++ 中的按位运算符?
        • 这两个查询不是有不同的含义吗?第一个是 ,这两个数字至少有一个公共位,而第二个是 ,两个数字都不为零。例如,“2 & 1”也为零。
        猜你喜欢
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        相关资源
        最近更新 更多