如何在oracle中通过序列生成以下数字
2
-2
2
-2
2
-2
以此类推。我可以在整个周期内生成1,2,1,2,1,2
,但在上面无法使用逻辑。
答案 0 :(得分:13)
这似乎是一个序列的奇怪要求,但是如果您真的想要,那么可以:
create sequence weird_seq
start with 2
increment by 4
maxvalue 2
minvalue -2
cycle
nocache;
select weird_seq.nextval from dual
connect by level <= 10;
NEXTVAL
----------
2
-2
2
-2
2
-2
2
-2
2
-2
increment 4
的范围是从-2到+2。 maxval 2
如此,因此下一个调用cycle
舍入到minval -2
。它必须以+/- 2开头。 nocache
是不幸的,但有必要,否则,您会收到“ ORA-04013:CACHE的编号必须少于一个循环”的信息。
如果您只是将这些数字用作查询的一部分,则可以改为使用分层查询:
select 2 * (2 * mod(level, 2) - 1)
from dual
connect by level <= 10;
2*(2*MOD(LEVEL,2)-1)
--------------------
2
-2
2
-2
2
-2
2
-2
2
-2
,但是多次运行将始终从+2开始,这可能不是您想要的。 (取决于如何使用...)
您还可以使用解析查询从现有数据中即时生成数字,但是同样,这取决于您将使用此数字的方式。
答案 1 :(得分:2)
这是使用CASE
和MOD
的简单方法
SELECT CASE WHEN mod(level, 2) = 1 THEN 2 ELSE -2 END sequence
FROM dual
CONNECT BY LEVEL <= 10;
答案 2 :(得分:1)
在更新语句中使用行号选择。
UPDATE yourtable
SET yourfield = yourfield*-1
WHERE yourfield IN
(SELECT yourfield FROM
(SELECT rownum rn, y."yourfield" yourfield FROM yourtable y)
WHERE MOD(rn, 2) = 0)
答案 3 :(得分:0)
我可以通过使用PL / SQL建议一种方法:
SQL> set serveroutput on;
SQL> Create sequence my_seq start with 2 minvalue -4;
Sequence created
SQL> Create or Replace Procedure Pr_Get_MySeq( o_val out pls_integer ) is
2 i_seq_name varchar2(35):= 'my_seq';
3 begin
4 execute immediate 'select '||i_seq_name||'.nextval from dual' INTO o_val;
5 execute immediate 'alter sequence '||i_seq_name||' increment by ' ||to_char(-2*o_val) || ' minvalue -4';
6 end;
7 /
Procedure created
SQL> var o_val number;
SQL> begin
2 Pr_Get_MySeq( :o_val );
3 end;
4 /
PL/SQL procedure successfully completed
o_val
---------
2
SQL> /
PL/SQL procedure successfully completed
o_val
---------
-2
SQL> /
PL/SQL procedure successfully completed
o_val
---------
2