2010-08-20 7 views
0

Quelqu'un peut-il me dire comment traduire l'instruction T-SQL suivante:besoin de traduire le cas t-sql spécifique pl/sql

SELECT fileld1 = CASE 
        WHEN T.option1 THEN -1 
        ELSE 
        CASE WHEN T.option2 THEN 0 
        ELSE 1 
        END 
       END 
    FROM Table1 AS T 

Le point est que je dois valider deux options différentes de la table un seul champ dans l'instruction select ..

J'ai essayé de faire somthing avec une instruction IF dans pl/sql, mais le travail ne marche pas pour moi tout simplement:

SELECT IF T.option1 THEN -1 
     ELSE IF T.option2 THEN 0 
     ELSE 1 
     END 
    FROM Table1 AS T 

Je ne suis pas vraiment sûr comment écrire l'instruction IF dans l'instruction SELECT.
Et aussi, je dois le faire à l'intérieur de l'instruction select parce que je construis une vue. Si je me souviens bien, PL/SQL prend également en charge le case

Répondre

2

Utilisation:

SELECT CASE 
     WHEN T.option1 = ? THEN -1 
     WHEN T.option2 = ? THEN 0 
     ELSE 1 
     END AS field1 
    FROM Table1 AS T 

Je ne peux pas obtenir votre TSQL d'origine pour travailler - je reçois:

Msg 4145, niveau 15, état 1, ligne 4 Une expression de non type booléen spécifié dans un contexte où une condition est attendue, près de 'THEN'.

... parce qu'il n'y a pas d'évaluation de valeur. Si vous vérifiez si les colonnes sont nulles, vous devez utiliser:

SELECT CASE 
     WHEN T.option1 IS NULL THEN -1 
     WHEN T.option2 IS NULL THEN 0 
     ELSE 1 
     END AS field1 
    FROM Table1 AS T 

... ou si vous avez besoin quand ils ne sont pas nulles:

SELECT CASE 
     WHEN T.option1 IS NOT NULL THEN -1 
     WHEN T.option2 IS NOT NULL THEN 0 
     ELSE 1 
     END AS field1 
    FROM Table1 AS T 

expressions CASE shortCircuit - si les premières correspondances WHEN, elle renvoie la valeur & qui ferme la gestion pour cette ligne - donc les options suivantes ne sont pas prises en compte.

1

Vous devez simplement déplacer l'alias de colonne de "field1=" avant l'expression "AS filed1" après l'expression.