2017-06-12 1 views
0

J'ai requête simple qui ne fonctionne pas:cas, sélectionnez une autre colonne AS400 requête

SELECT BATCH_0002.CREATOR, BATCH_0002.GLEXR, 
case when BATCH_0002.GLIVD >'0' THEN BATCH_0002.GLIVD ELSE BATCH_0002.date end 
as tarih FROM BATCH_0002 

erreur est:

ERROR: [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0581 - The results in a CASE expression are not compatible. Error Code: -581

mais quand je change de nom de la colonne à quelque chose de différent que GLIVD, il travaille .

SELECT BATCH_0002.CREATOR, BATCH_0002.GLEXR, 
case when BATCH_0002.GLIVD >'0' THEN BATCH_0002.GLEXR ELSE BATCH_0002.date end 
as tarih FROM BATCH_0002 

Y at-il un problème avec ma déclaration de cas?

+0

Pouvez-vous poster la définition de la table pour 'BATCH_0002'? –

+0

Quels types de données sont les colonnes GLIVD et GLEXR? – scaisEdge

Répondre

0

Dans le type de données du résultat de l'instruction Case, il doit être identique. Ici Utilisation d'int et la date comme résultat dans le cas où est pourquoi erreur montrant des données incompatibles

vous devriez jeter un à un autre type de données

SELECT BATCH_0002.CREATOR, BATCH_0002.GLEXR, case when BATCH_0002.GLIVD >'0' THEN cast(BATCH_0002.GLIVD as char) ELSE cast(BATCH_0002.date as char) end as tarih FROM BATCH_0002 
+0

merci mais cela fonctionne; cas lorsque BATCH_0002.GLIVD> 0 ALORS BATCH_0002.GLEXR ELSE BATCH_0002.date fin comme tarih FROM BATCH_0002 GLIVD est "numérique" GLEXTR est "char (30)" DATE est "date" – Teo

+0

la date peut être convertie en caractère char mais pas en valeur numérique – Ravi

+0

SELECT BATCH_0002.CREATOR, BATCH_0002.GLEXR, cas lorsque BATCH_0002.GLIVD> '0' ALORS cast (BATCH_0002.GLIVD comme char) ELSE BATCH_0002.date fin comme tarih FROM BATCH_0002 – Ravi

0

merci pour toutes les réponses concernant les types de données. travaillé sur cette information et maintenant résolu, cela fonctionne très bien:

SELECT BATCH_0002.CREATOR, BATCH_0002.GLEXR, 
    case when BATCH_0002.GLIVD >'0' THEN 
    DATE(CHAR(1900000 + BATCH_0002.GLIVD)) 
    ELSE BATCH_0002.date end as tarih FROM BATCH_0002