1

intの値が(各ビットがフラグである)ビットフィールドとして使用されているテーブルを持っています。バイナリで集計されたビットフィールド値

ように、今、私は(私の場合にはOR)バイナリ操作でそれらを集約したいと思います:これを行うには良い方法だろうどのような値171

につながる

SELECT 1 AS bitfield 
INTO #TABLE 
UNION ALL SELECT 1 + 2 + 8 + 32 
UNION ALL SELECT 2 + 128 
UNION ALL SELECT 2 + 32 

SELECT AND_AGGR(bitfield) -- Invalid because AND_AGGR doesn't exist 
FROM #TABLE 

DROP #TABLE 

それはうまくいけば|MAXの多くを必要としません(しかし、あなたがする必要があります、あなたがする必要があります)?

私は自分でMS SQL Server 2008を使用していますが、他のサーバー上のソリューションも重要です。

+1

"私はバイナリ操作でそれらを集計したいと思います(私の場合はANDです)" OR "ではなく" AND "を意味しますか? –

+0

もちろん私はします。私はそれを変更します。それを指摘してくれてありがとう:) – ANisus

答えて

1

あなたは結果171を期待している場合は、きっとあなたがバイナリORないANDを意味ですか?いずれの場合においても

、このソリューションは、変数に値を集計:

SELECT 1 AS bitfield 
INTO #TABLE 
UNION ALL SELECT 1 + 2 + 8 + 32 
UNION ALL SELECT 2 + 128 
UNION ALL SELECT 2 + 32 

DECLARE @i int = 0 

SELECT @i = @i | bitfield 
FROM #TABLE 

SELECT @i 

DROP TABLE #table 

あなたが別のフィールドでグループに集約したい場合、これはあなたの要件を満たしていない可能性があります。

大きなテーブルではうまく動作しません。

+0

私の例では、そのソリューションを使用することができます。実際のケースではいくつかのフィールドでグループ化したいと思っていますが、Mark Byersによって与えられたMAX(bitfield | 1)+ ...ソリューションがその場合には動作すると仮定します。 – ANisus

2

MySQLとPostgreSQLではBIT_ORを使用できます。

SQL Serverには、この集約機能はありません。

あなたが言ったようにあなたはMAX&の多くでそれを行うことができます:

MAX(x & 1) + MAX(x & 2) + ... + MAX(x & 128) 
+0

答えをありがとう!ああ、この単一のケースでは間違ったデータベースソリューションを持っているだけです。しかし、私の疑惑を証明するのを助けたので、答えに感謝します。 – ANisus

関連する問題