动态获取数字列的最大和最小允许值?

时间:2011-02-23 06:13:23

标签: sql oracle oracle10g

假设一个名为money的列,NOT NULL,其类型为NUMBER(x,y)。此列没有约束。

我想根据此序列对此money列进行排序,+ ve> -ve> 0,所以我的计划是将0值解码为money列可以在order by子句中保存的最小允许值,如select * from tableXXX order by decode(money, 0 , allowableMnimumValueForMoneyColumn , money) desc。我只是想知道是否有可能动态地获得money列的最小允许值。

如何获取列的最大和最小允许值? oracle有隐含的变量来做吗?

3 个答案:

答案 0 :(得分:1)

您似乎希望money = 0的值最后显示的记录。

如果是这种情况,您可以使用这样的订单条款:

order by 
case when money = 0 then 0
                    else 1 
end desc,
money desc

通过一个工作示例,那将是

create table tq84_order_by (
  txt   varchar2(10),
  money number not null
);

insert into tq84_order_by values ('aaa', 0);
insert into tq84_order_by values ('bbb', 2);
insert into tq84_order_by values ('ccc',-3);
insert into tq84_order_by values ('ddd', 4);
insert into tq84_order_by values ('eee', 1);

select * from tq84_order_by
order by 
case when money = 0 then 0
                    else 1 
                    end desc,
                    money desc;

导致

TXT             MONEY
---------- ----------
ddd                 4
bbb                 2
eee                 1
ccc                -3
aaa                 0    

答案 1 :(得分:1)

您不必知道最小值。您可以将NULL视为最小值:

... ORDER BY decode(money, 0, NULL, money) NULLS LAST

答案 2 :(得分:0)

您需要在列上创建检查约束:

CREATE TABLE TEST (MONEY NUMBER(14,2) NOT NULL)
/

ALTER TABLE TEST ADD
  CONSTRAINT MONEY_VALID CHECK (( MONEY > 100 AND MONEY < 5000))
/

-- This fails
INSERT INTO TEST VALUES (20);

-- This works
INSERT INTO TEST VALUES (110);