在Oracle SQL中,如何根据列中的二进制值复制行?

时间:2015-09-09 06:36:31

标签: sql oracle

问题:

+------+--------+
| NAME | BINARY |
+------+--------+
| A    |   1101 |
| B    |   0011 |
+------+--------+

我有NAME和BINARY值的表。 我必须通过考虑它们各自的BINARY值来复制行,包括ID列。

在给定的示例中,名称A的BINARY值为1101,这意味着它应该有3行,其ID为A-01,A-02,A-04,并且不应为A添加任何行-03,因为二进制值(11’0’1)为0。 如何在Oracle SQL查询中执行此操作?我用11g。

预期输出:

+------+--------+------+
| NAME | BINARY |  ID  |
+------+--------+------+
| A    |   1101 | A-01 |
| A    |   1101 | A-02 |
| A    |   1101 | A-04 |
| B    |   0011 | B-03 |
| B    |   0011 | B-04 |
+------+--------+------+

1 个答案:

答案 0 :(得分:2)

您可以使用dual中带有connect by level子句的查询生成一系列从1到4的数字,然后(反)将其加入到表中并检查其中的字符binary中的排名是01

SELECT name, bin, name || '-0' || lev AS id
FROM   mytable
JOIN   (SELECT     LEVEL AS lev
        FROM       dual
        CONNECT BY LEVEL <= 4) ON SUBSTR(bin, lev, 1) != '0'

此查询的假设:

  1. 我调用了列bin而不是binary,因为它是一个保留字。如果需要,您可以使用binary并用引号括起来。
  2. 我认为bin列是varchar。如果不是,请使用to_char将其转换为查询中的字符串
  3. <强> SQLFiddle