2012-12-26 4 views
6

Salut est-il un moyen d'utiliser le décodage pour vérifier les valeurs positives et négatives en sql?Utilisation du décodage pour vérifier les valeurs négatives et positives

par exemple.

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

si la logique est codé dans l'instruction if sinon il sera quelque chose comme ceci:

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 

Merci.

Répondre

6

Vous devez cas déclaration

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; 
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; 
+0

Merci, quel est l'avantage d'inclure money_return après l'instruction CASE? – user1872384

1

Vous pouvez utiliser comme comme ça,

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

La déclaration de décodage ci-dessus est équivalente à la suivante instruction 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; 

Donc, votre code final devrait être quelque chose comme ça,

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

@rs. Il demande s'il existe un moyen d'utiliser le décodage pour vérifier les valeurs positives et négatives en sql? Il n'est pas au courant de DECODE je suppose. Voir qu'il ya une mauvaise syntaxe dans sa question – Mari

+0

Mind pour partager quelle partie est erronée pour la partie de décodage? peut-être erreur typo? – user1872384

+0

@ user1872384 Vous ne pouvez pas utiliser '** <0 **' comme ceci dans la fonction de décodage. J'espere. Pouvez-vous vérifier et laissez-moi savoir si cela fonctionne dans votre environnement – Mari

0

Si c'est la seule formule que vous utilisez, vous pouvez faire:

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

SQL Fiddle pour vérifier les résultats. Maintenant, ceci est très, très fragile, et ne fonctionnera pas si le scénario change.

+0

ok merci sweko, préfèrent toujours la méthode de cas. – user1872384

+1

S'il vous plaît, faites-vous le code 'case' en production. C'est beaucoup plus clair et maintenable. – SWeko

5

Vous pouvez utiliser 'signe' avec un décodage. Le signe retourne -1 pour tout négatif, 0 pour 0 et 1 pour toute positif:

SELECT 
    decode(
     sign(money_return), 
     - 1, 
     abs(money_return), 
     1, 
     money_return * 10, 
     money_return 
    ) 
FROM 
    cash_t; 
0
SELECT 
    decode(
     money_return - Abs(money_return), 
     0, 
     money_return * 10, 
     abs(money_return) 
    ) 
FROM 
    cash_t; 

Si la valeur est positive, déduction faite d'elle-même sera de retour 0 et sera appliqué à la première condition . Sinon, il est négatif et la deuxième condition est appliquée. 0 Entrera dans la première condition et retournera 0 (comme 0 * 10).

+0

Besoin d'absolu la valeur soustraite ou cette équation retournera toujours zéro. choisir décoder (: money_return-abs (: money_return), 0,: money_return * 10, abs (: money_return)) de dual; – DHough

1

J'utilise la fonction "plus grand" et "moins" trouvé Valeurs positives ou Valeur négative.

exemple.

décodage de sélection (plus grande (valeur 0), 0, 'négatif', 'positif') de double

ou

décodage de sélection (moins (valeur 0) , 0, 'positive', 'négative') de double

merci

1

Utilisez SIGN(). Il renvoie "0" pour 0, "1" pour positif et "-1" pour les valeurs négatives.

SELECT 
    DECODE(
     SIGN(money_return), 
     0, 
     money_return, 
     1, 
     money_return * 10, 
     - 1, 
     ABS(money_return) 
    ) 
FROM 
    CASH_T; 
Questions connexes