为二进制数字段生成多行?

时间:2014-09-05 20:32:37

标签: sql openedge

示例数据行:

| ID  | First Name | Last Name | Federal Race Code |
| 101 | Bob        | Miller    | 01010             |
| 102 | Daniel     | Smith     | 00011             |

“联邦竞赛代码”字段包含二进制数据,每个“1”用于确定是否在特定Web表单上设置了特定复选框。例如,第一位是美洲印第安人,第二位是亚洲人,第三位是非裔美国人,第四位是太平洋岛民,第五位是白人。

我需要为每个设置为“1”的位生成一个单独的行。因此,鉴于上面的示例,我需要生成如下所示的输出:

| ID  | First Name | Last Name | Mapped Race Name  |
| 101 | Bob        | Miller    | Asian             |
| 101 | Bob        | Miller    | African American  |
| 102 | Daniel     | Smith     | Pacific Islander  |
| 102 | Daniel     | Smith     | White             |

有关如何解决此问题的任何提示或想法?

1 个答案:

答案 0 :(得分:1)

您可以使用UNION的6个查询或一个UNPIVOT子句来执行此操作。

在任何情况下,您应该首先将该二进制逻辑拆分为6列:

SELECT *, 
 CASE WHEN federal_race_code & 16 = 16 THEN 1 ELSE 0 END as NativeAmerican,
 ..
 CASE WHEN federal_race_code & 1 = 1 THEN 1 ELSE 0 END as White
FROM myTable

然后是UNION:

SELECT *, 'Native American' AS Race 
FROM (<subquery>)
WHERE NativeAmerican = 1
UNION
...
UNION
SELECT *, 'White' AS Race 
FROM (<subquery>)
WHERE White = 1

如果您使用的是Oracle或SQL服务器,请使用CTE。