问题:
+------+--------+
| 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 |
+------+--------+------+
答案 0 :(得分:2)
您可以使用dual
中带有connect by level
子句的查询生成一系列从1到4的数字,然后(反)将其加入到表中并检查其中的字符binary
中的排名是0
或1
:
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'
此查询的假设:
bin
而不是binary
,因为它是一个保留字。如果需要,您可以使用binary
并用引号括起来。bin
列是varchar
。如果不是,请使用to_char
将其转换为查询中的字符串<强> SQLFiddle 强>