[英]generating same positive and negative number in Oracle sequence
如何在oracle中通过序列生成以下数字
2
-2
2
-2
2
-2
等等。 我可以通过循环产生1,2,1,2,1,2
但是上面我不能使用逻辑。
这似乎是一个奇怪的序列要求,但如果你真的想要那么你可以这样做:
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
s round到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开始,这可能不是你想要的。 (取决于它将如何使用......)
您可能还可以使用分析查询从现有数据中动态生成数字,但同样,它取决于您将使用此数据。
这是使用CASE
和MOD
做同样的简单方法
SELECT CASE WHEN mod(level, 2) = 1 THEN 2 ELSE -2 END sequence
FROM dual
CONNECT BY LEVEL <= 10;
在update语句中使用rownumber选择。
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)
我可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.