ビット単位の集計関数
ビット単位の集計関数は、ビット演算を計算し、整数値に変換または丸めることができる整数の列と列の集計を実行します。
ビット単位の集計 NULL を使用する
ビット単位関数が Null 使用可能な列に適用されている場合、NULL 値は関数の結果が計算される前に削除されます。集計を満たす行がない場合、ビット単位関数は NULL を返します。同じ動作が標準の集計関数に適用されます。次に例を示します。
select sum(venueseats), bit_and(venueseats) from venue where venueseats is null; sum | bit_and ------+--------- null | null (1 row)
ビット単位の集計の DISTINCT サポート
他の集計関数のように、ビット単位関数は DISTINCT キーワードをサポートします。
ただし、これらの関数で DISTINCT を使用しても結果に影響はありません。値の最初のインスタンスは、ビット単位の AND または OR 演算を満たすのに十分です。評価される式に重複する値が存在する場合でも、違いはありません。
DISTINCT プロセスはクエリ実行オーバーヘッドを伴う可能性があるため、ビット単位の関数で DISTINCT を使用しないことをお勧めします。
ビット単位関数の概要の例
以下に、ビット単位の関数を操作する方法を示す概要例をいくつか示します。また、各関数の説明とともに特定のコード例を見つけることができます。
ビット単位の関数の例は、TICKIT サンプルデータベースに基づいています。TICKIT サンプルデータベースの USERS テーブルには複数のブール列が含まれ、ユーザーごとに異なるイベントのタイプ (スポーツ、演劇、オペラなど) を好きかどうかを示しています。以下に例を示します。
select userid, username, lastname, city, state, likesports, liketheatre from users limit 10; userid | username | lastname | city | state | likesports | liketheatre -------+----------+-----------+--------------+-------+------------+------------- 1 | JSG99FHE | Taylor | Kent | WA | t | t 9 | MSD36KVR | Watkins | Port Orford | MD | t | f
USERS テーブルの新しいバージョンが別の方法で構築されていると想定します。この新しいバージョンでは、各ユーザーが好きまたは嫌いな 8 種類のイベントを (バイナリ形式で) 定義する 1 つの整数列です。この設計では、各ビット位置はイベントの種類を表します。8 種類すべてのタイプが好きなユーザーは、(以下のテーブルの 1 行目のように) 8 ビットすべてが 1 に設定されています。これらのどのイベントも好きではないユーザーは、8 ビットすべてに 0 が設定されます (2 行目を参照)。スポーツとジャズのみが好きなユーザーを次の 3 行目に示しています。
USER | SPORTS | THEATRE | JAZZ | OPERA | ROCK | VEGAS | BROADWAY | CLASSICAL |
---|---|---|---|---|---|---|---|---|
ユーザー 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
ユーザー 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ユーザー 3 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
データベーステーブルでこれらのバイナリ値は、次のように整数として 1 つの LIKES 列に保存される場合があります。
ユーザー | バイナリ値 | 保存値 (整数) |
---|---|---|
ユーザー 1 | 11111111 | 255 |
ユーザー 2 | 00000000 | 0 |
ユーザー 3 | 10100000 | 160 |