2017-08-15 2 views
1

J'ai un scénario dans lequel je dois vérifier la date et une valeur pour déterminer le résultat.Utilisation de la condition ET dans le décodage

Ex-

case when my_date > '10-01-2011' and my_value = 0 then 
'Do this' 
else 
'Do that' 
end 

Je suis en train de l'utiliser dans Oracle requête SQL, je me demandais s'il y a une meilleure approche de cette logique plutôt que d'utiliser la déclaration de cas; peut-être en utilisant le décodage ou toute autre fonction d'Oracle.

+6

Ceci est parfaitement bien, decode va compliquer et ne peut pas être utilisé avec * supérieur * –

+2

'cas où then' expression de cas est une partie de ANSII SQL standard et est pris en charge par presque tous les SGBD. 'Decode' fonctionne sur Oracle, mais vous ne pouvez pas trouver cette fonction sur les principaux systèmes SGBD restants - PostgreSQL, SQL-Server, MySql, SQLite etc. Je vous recommande d'utiliser des expressions de cas au lieu de DECODE. – krokodilko

+1

En plus des commentaires précédents (coller avec CASE, pas DECODE), quel est le type de données de la colonne my_date? Si c'est du type de données DATE, alors ne le comparez pas à une chaîne - convertissez explicitement la chaîne en une date en utilisant 'to_date()' avec le masque de format approprié (par exemple 'to_date ('10 -01-2011 ', 'dd-mm-yyyy') ') ou (s'il n'y a pas d'élément time dans la valeur de votre date) en utilisant le littéral' DATE' (par exemple 'DATE '2011-01-10''). – Boneist

Répondre

4

CASE est la norme ANSI SQL pour la logique conditionnelle en SQL. Votre code est donc correct sauf pour la chaîne '10 -01-2011 'que vous traitez implicitement comme une date. J'utilise la norme ANSI DATE le format littéral pour cela:

case when my_date > date '2011-01-10' and my_value = 0 then 
    'Do this' 
else 
    'Do that' 
end 

DECODE solution était propriétaire à SQL conditionnelle d'Oracle avant CASE était disponible. La même logique pourrait être exprimée en utilisant DECODE comme ceci:

decode (my_value, 
     0, decode (sign (my_date - date '2011-01-10'), 
        1, 
        'Do this', 
        'Do that'), 
     'Do that') 

Pas très élégant ou lisible est-il? Il utilise également la fonction SIGN, qui renvoie 1 pour un nombre positif, -1 pour négatif et 0 pour 0.

Notez également que CASE peut être utilisé dans PL/SQL alors que DECODE ne peut pas.

-- This works 
myvar := case when x=1 then 'a' else 'b' end; 
-- This doesn't 
myvar := decode (x, 1, 'a', 'b'); 
+1

Bonne explication. J'aime particulièrement l'utilisation de 'date'. –