sql >> データベース >  >> RDS >> Sqlserver

SQLで2つのビットマスクを比較して、いずれかのビットが一致するかどうかを確認します

    あなたの質問への答えは、ビット単位の&を使用することです このように:

    SELECT * FROM UserTable WHERE Roles & 6 != 0
    

    6 ユーザーがこれらのビットを1つ以上持っていることを確認したい場合は、ビットフィールドの任意の組み合わせと交換できます。これを検証しようとするとき、私は通常、これをバイナリで手書きで書き出すことが役立つと思います。ユーザーテーブルは次のようになります:

            1   2   4
    ------------------
    Dave    0   1   1
    Charlie 0   1   0
    Susan   0   0   1   
    Nick    1   0   0
    

    あなたのテスト(6)はこれです

            1   2   4
    ------------------
    Test    0   1   1
    

    私たちがビットウェイズをしている一人一人を通り抜けると、テストに対して私たちはこれらを得る:

            1   2   4
    ------------------
    Dave    0   1   1   
    Test    0   1   1
    Result  0   1   1 (6)
    
    Charlie 0   1   0
    Test    0   1   1
    Result  0   1   0 (2)
    
    Susan   0   0   1
    Test    0   1   1
    Result  0   0   1 (4)
    
    Nick    1   0   0
    Test    0   1   1
    Result  0   0   0 (0) 
    

    上記は、結果がゼロではないレコードに1つ以上の要求されたフラグがあることを示しているはずです。

    編集:これを確認したい場合のテストケースは次のとおりです

    with test (id, username, roles)
    AS
    (
        SELECT 1,'Dave',6
        UNION SELECT 2,'Charlie',2
        UNION SELECT 3,'Susan',4
        UNION SELECT 4,'Nick',1
    )
    select * from test where (roles & 6) != 0  // returns dave, charlie & susan
    

    または

    select * from test where (roles & 2) != 0 // returns Dave & Charlie
    

    または

    select * from test where (roles & 7) != 0 // returns dave, charlie, susan & nick
    


    1. RailsアプリをHerokuにプッシュする/「pg」gemをインストールするのに問題がありますか?

    2. パラメータがnonedjangoの場合のクエリ

    3. mysqlでローカル変数とプリペアドステートメントにselectを使用する

    4. Postgresql1つのテーブルの複数のカウント