oracle case when修改,如何改写case when ?

SELECT DECODE(first_tb.flag,

NULL,

CASE

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '6')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '6') THEN

'6'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '5')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '5') THEN

'5'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '4')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '4') THEN

'4'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '3')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '3') THEN

'3'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '2')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '2') THEN

'2'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '1') THEN

'1'

END,

CASE

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '6')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '6') THEN

'6'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '5')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '5') THEN

'5'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '4')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '4') THEN

'4'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '3')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '3') THEN

'3'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '2')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '2') THEN

'2'

WHEN ABS(NVL(first_tb.margin_shortfall, 0)) >=

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'A'

AND shortfall_level = '1') THEN

'1'

END) AS alt_level,

.....

from (select .. from xx)first_tb

其中first_tb是一个复杂的查询,由first_tb得到first_tb.margin_shortfall的值,然后进行判断得到不同的级别

下面的字句存在大量重复,仅仅是由于列值shortfall_level = '6'不同。 有什么样的方法能否简化并使得查询高效?

(SELECT start_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '6')

AND ABS(NVL(first_tb.margin_shortfall, 0)) <=

(SELECT end_shortfall

FROM comp_level

WHERE above_or_below_alert_level = 'B'

AND shortfall_level = '6')

SQL> desc comp_level

Name                                      Null?    Type

----------------------------------------- -------- ----------------------------

ABOVE_OR_BELOW_ALERT_LEVEL                NOT NULL CHAR(1)

SHORTFALL_LEVEL                           NOT NULL NUMBER(2)

START_SHORTFALL                           NOT NULL NUMBER(10)

END_SHORTFALL                             NOT NULL NUMBER(10)

SQL> select * from comp_level;

A SHORTFALL_LEVEL START_SHORTFALL END_SHORTFALL

- --------------- --------------- -------------

B               2         3000000      10000000

B               3         2000000       3000000

B               4          500000       2000000

B               5           10000        500000

B               6               0         10000

A               2         1000000       5000000

A               3          500000       1000000

A               4          100000        500000

A               5            5000        100000

A               6               0          5000

B               1        10000000            -1

A SHORTFALL_LEVEL START_SHORTFALL END_SHORTFALL

- --------------- --------------- -------------

A               1         5000000            -1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值