Comment faire une instruction NVL (ou DECODE ou CASE) dans une requête SQL Informix SE?
Question
IBM est très clair sur son moteur Informix Standard Engine, il ne prend en charge ni CASE ni DECODE. " Mettez à niveau vers une nouvelle version " : http://www-01.ibm.com/support/docview.wss?rs=632&context=SSGU5Y&dc=DB560&dc=DB520&uid=swg21189712&loc=en_US_amp;=8 ; lang = fr & amp; rss = ct632db2
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) dans MyTable
La solution
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ée pour presque tous les types (à l'exception des chaînes de plus de 32 caractères), car SE est très efficace pour la conversion entre types. SE ne prend pas non plus en charge la diffusion explicite - il est raisonnable de supposer que SE ne possède pas beaucoup de SQL après SQL-89.
Autres conseils
Si vous consultez le site IIUG dans la zone de téléchargement, vous Vous y trouverez une collection de routines SPL pour émuler ces fonctions et d’autres. Celui que vous recherchez est la collection appelée "orclproc".