8

嗨,有没有办法使用解码来检查 sql 中的正值和负值?

例如

select decode(money_return, **<0**, abs(money_return), **>0**, 
money_return*10, money_return) from cash_t;

如果逻辑被编码在 if else 语句中,它将是这样的:

if(money_return<0){money_reutrn = abs(money_return);}
else if(money_return>0){money_reutrn = money_return*10;}
else {money_return = money_return;}
end

谢谢你。

4

8 回答 8

10

您可以将“符号”与解码一起使用。Sign 将返回 -1 表示任何负数,0 表示 0,1 表示任何正数:

select decode(sign(money_return), -1, abs(money_return), 
                                   1, money_return*10, 
                                   money_return) 
from cash_t;
于 2013-04-24T21:43:01.587 回答
7

你需要案例陈述

select CASE 
 WHEN money_return < 0 THEN abs(money_return)
 WHEN money_return > 0 THEN money_return*10
 ELSE money_return END money_return from cash_t;
于 2012-12-26T07:25:11.670 回答
2

使用 SIGN()。它返回“0”表示 0,“1”表示正值,“-1”表示负值。

SELECT
    DECODE(
        SIGN(money_return),
        0,
        money_return,
        1,
        money_return * 10,
        - 1,
        ABS(money_return)
    )
FROM
    CASH_T;
于 2017-02-21T17:50:03.800 回答
1

你可以像这样使用,

SELECT supplier_name,
decode(supplier_id, 10000, 'IBM',
                    10001, 'Microsoft',
                    10002, 'Hewlett Packard',
                    'Gateway') result
FROM suppliers;

上面的 decode 语句等价于下面的 IF-THEN-ELSE 语句:

IF supplier_id = 10000 THEN
   result := 'IBM';

ELSIF supplier_id = 10001 THEN
   result := 'Microsoft';

ELSIF supplier_id = 10002 THEN
   result := 'Hewlett Packard';

ELSE
   result := 'Gateway';

END IF;

所以你的最终代码应该是这样的,

select decode(money_return, money_return<0, abs(money_return),
                            money_return>0, money_return*10,
                                            money_return) result
from cash_t;
于 2012-12-26T07:29:07.607 回答
1

我使用函数“最大”和“最小”找到正值或负值。

例子。

从对偶中选择 decode(greatest(value,0), 0,'Negative','Positive')

或者

从对偶中选择 decode(least(value,0), 0,'Positive','Negative')

谢谢

于 2016-08-23T05:00:51.547 回答
0
select CASE money_return  
  WHEN money_return < 0 THEN abs(money_return) 
  WHEN money_return > 0 THEN money_return*10
  ELSE money_return END money_return from cash_t;
于 2012-12-26T07:27:54.637 回答
0

如果这是您使用的唯一公式,您可以这样做:

select (11 *abs(money_return) + 9 *money_return)/2 as money_return
from cash_t

SQL Fiddle检查结果。

现在,这是非常非常脆弱的,如果场景发生变化,它将无法工作。

于 2012-12-26T07:29:24.483 回答
0
SELECT
    decode(
        money_return - Abs(money_return),
        0,
        money_return * 10,
        abs(money_return)
    )
FROM
    cash_t;

如果值为正,则从自身中扣除将返回 0,并应用第一个条件。否则,它是否定的并且应用第二个条件。0 将适合第一个条件并返回 0(如 0*10)。

于 2016-02-26T10:13:09.513 回答