在Oracle序列中生成相同的正数和负数

时间:2018-08-09 08:43:15

标签: sql oracle plsql sequence

如何在oracle中通过序列生成以下数字

2
-2
2
-2
2
-2

以此类推。我可以在整个周期内生成1,2,1,2,1,2,但在上面无法使用逻辑。

4 个答案:

答案 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)

这是使用CASEMOD的简单方法

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