2009-06-25 7 views
1

IBM est très clair sur son moteur standard Informix, il ne supporte ni CASE ni DECODE. "Veuillez passer à une nouvelle version": http://www-01.ibm.com/support/docview.wss?rs=632&context=SSGU5Y&dc=DB560&dc=DB520&uid=swg21189712&loc=en_US&cs=UTF-8&lang=en&rss=ct632db2Comment faire une instruction NVL (ou DECODE ou CASE) dans une requête SQL Informix SE?

Cela n'arrivera jamais! Alors, peut-être que quelqu'un pourrait avoir une idée. Je veux avoir l'équivalent de:

Sélectionnez NVL (C1, C2) de MyTable

+0

Je ne sais rien sur le sujet mais .. utiliser une base de données différente? :) – stefanB

+0

Huhu, bien sûr, je vais convaincre tout mon supérieur que nous devons utiliser un autre DB parce que je ne suis pas capable de faire un cas? : p –

+1

Non, car la base de données est a) incroyablement obsolète pour ne pas supporter nvl, case ou decode (sans parler des fonctionnalités plus avancées, je suppose) et b) leur coûter (m | b) illions en développement supplémentaire ce qui ont été évités avec probablement toute DB moderne. – l0b0

Répondre

3
CREATE PROCEDURE NVL(a CHAR(32), b CHAR(32) DEFAULT NULL, 
           c CHAR(32) DEFAULT NULL, 
           d CHAR(32) DEFAULT NULL, 
           e CHAR(32) DEFAULT NULL, 
           f CHAR(32) DEFAULT NULL, 
           g CHAR(32) DEFAULT NULL) 
    RETURNING CHAR(32); 
    IF a IS NOT NULL THEN RETURN a; 
    ELIF b IS NOT NULL THEN RETURN b; 
    ELIF c IS NOT NULL THEN RETURN c; 
    ELIF d IS NOT NULL THEN RETURN d; 
    ELIF e IS NOT NULL THEN RETURN e; 
    ELIF f IS NOT NULL THEN RETURN f; 
    ELSE     RETURN g; 
    END IF; 
END PROCEDURE; 

Ou - moins généralement:

-- @(#)$Id: nvl_int.spl,v 1.1 1996/08/26 18:33:11 johnl Exp $ 
-- 
-- nvl_integer: return v1 if it is not null else return v2 

CREATE PROCEDURE nvl_integer(v1 INTEGER, v2 INTEGER DEFAULT 0) 
    RETURNING INTEGER; 

    DEFINE rv INTEGER; 

    IF v1 IS NOT NULL THEN 
     LET rv = v1; 
    ELSE 
     LET rv = v2; 
    END IF 

    RETURN rv; 

END PROCEDURE; 

La version CHAR peut être utilisé pour presque n'importe quel type (sauf les chaînes de plus de 32, comme écrit) parce que SE est très bon pour convertir entre les types. SE ne prend pas en charge le casting explicite, non plus - il est sûr de supposer que SE n'a pas beaucoup de SQL après SQL-89.

+0

J'ai vérifié NVL() sur IDS 11.50 (pas SE 7.2x). Si cela ne fonctionne pas sur SE, les différences requises devraient être petites - probablement une différence dans le nombre de points-virgules requis. –

+0

@Jonathan, j'ai supprimé ma réponse parce que votre réponse beaucoup mieux le rend non pertinent –

2

Si vous jetez un coup d'oeil sur le IIUG Site dans la zone des téléchargements, vous y trouverez une collection de routines SPL pour émuler ces fonctions et bien d'autres. Le spécifique que vous recherchez est la collection appelée "orclproc".

+0

Wow, joli lien merci! Cela m'aidera avec beaucoup d'autres problèmes. –

Questions connexes