假设一个名为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有隐含的变量来做吗?
答案 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);