Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

按位函数示例

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 种类型的活动。在此设计中,每个位位置均表示一类活动,而且某个喜欢全部 8 种类型的用户已将全部 8 个位设置为 1(如下表的第一行中所示)。不喜欢任何这些活动的用户已将全部 8 个位设置为 0(请见第二行)。仅喜欢运动和爵士乐的用户显示在第三行中:

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

在数据库表中,这些二进制值可作为整数存储在一个 LIKES 列中:

用户 二进制值 存储的值(整数)
用户 1 11111111 255
用户 2 00000000 0
用户 3 10100000 160

BIT_AND 和 BIT_OR 示例

假定有意义的商业信息存储在整数列中,您可使用按位函数提取和聚合该信息。以下查询将 BIT_AND 函数应用于名为“USERLIKES”的表的 LIKES 列中并按 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)

这些结果的解释如下:

  • Santa Barbara 的整数值 192 转换为二进制值 11000000。换句话说,此城市中的所有用户都喜欢运动和戏剧,但并非所有用户都喜欢任何其他类型的活动。

  • 整数 64 转换为 01000000,因此,对于圣荷西的所有用户来说,他们喜欢的唯一活动类型是戏剧。

  • 其他三个城市的值 0 表示这些城市中的所有用户没有共同的“喜好”。

如果将 BIT_OR 函数应用于相同的数据,则结果如下所示:

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)。对于洛杉矶,至少有一个用户喜欢除运动之外的所有活动类型 (127=01111111)。

BOOL_AND 和 BOOL_OR 示例

您可以对布尔表达式或整数表达式使用布尔函数。例如,以下查询从 TICKIT 数据库中的标准 USERS 表返回结果,该表包含多个布尔列。

BOOL_OR 函数对所有 5 个行返回 true。每个州中至少有一个用户喜欢运动。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)