メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

ビット単位関数の例

TICKIT サンプルデータベースの USERS テーブルには複数のブール列が含まれ、ユーザーごとに異なるイベントのタイプ (スポーツ、演劇、オペラなど) を好きかどうかを示しています。以下に例を示します。

Copy
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 が設定されます (以下のテーブルの 1 行目)。これらのどのイベントも好きではないユーザーは、8 ビットすべてに 0 が設定されます (2 行目を参照)。スポーツとジャズのみが好きなユーザーを 3 行目に示しています。

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

BIT_AND および BIT_OR の例

有効な企業情報が整数列に保存されるとすると、ビット単位関数を使用してこの情報を抽出および集計できます。次のクエリは USERLIKES と呼ばれるテーブルの LIKES 列に BIT_AND 関数を適用し、CITY 列による結果をグループ化します。

Copy
select city, bit_and(likes) from userlikes group by city order by city; city | bit_and ---------------+--------- Los Angeles | 0 Sacramento | 0 San Francisco | 0 San Jose | 64 Santa Barbara | 192 (5 rows)

これらの結果は次のように解釈できます。

  • サンタバーバラの整数値 192 は、バイナリ値 11000000 に変換されます。つまり、この都市のすべてのユーザーがスポーツと演劇を好きですが、すべてのユーザーがその他のタイプのイベントを好きというわけではありません。

  • 整数 6401000000 に変換するため、サンノゼのユーザーの場合、全員が好きなイベントタイプは演劇のみです。

  • 他の 3 都市の 0 の値は、「好き」と回答したユーザーがこれらの都市で 1 人もいないことを示します。

BIT_OR 関数を同じデータに適用する場合、結果は次のとおりです。一覧表示された 4 都市では、すべてのイベントタイプで「好き」と答えたユーザーが少なくとも 1 人います

Copy
select city, bit_or(likes) from userlikes group by city order by city; city | bit_or ---------------+-------- Los Angeles | 127 Sacramento | 255 San Francisco | 255 San Jose | 255 Santa Barbara | 255 (5 rows)

(255=11111111)。ロサンゼルスでは、スポーツを除くすべてのイベントタイプで「好き」と答えたユーザーが少なくとも 1 人います (127=01111111)。

BOOL_AND および BOOL_OR の例

ブール関数をブール式または整数式のどちらかに対して使用できます。例えば、次のクエリは複数のブール列のある TICKIT データベースの標準 USERS テーブルから結果を返します。

BOOL_OR 関数は 5 行すべてに true を返します。これらの州のそれぞれにおいて少なくとも 1 人のユーザーがスポーツを好きです。BOOL_AND 関数は 5 行すべてに false を返します。これら各州のすべてのユーザーがスポーツを好きというわけではありません。

Copy
select state, bool_or(likesports), bool_and(likesports) from users group by state order by state limit 5; state | bool_or | bool_and -------+-------------------- AB | t | f AK | t | f AL | t | f AZ | t | f BC | t | f (5 rows)