Wie eine NVL (oder DECODE oder CASE) Anweisung innerhalb einer Informix SE SQL-Abfrage zu tun?
Frage
IBM ist sehr klar auf seine Informix Standard-Motor, ist es nicht keinem der beiden Fälle noch DECODE nicht unterstützt. "Bitte aktualisieren Sie auf eine neue 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=ct632db2
Es wird nie passieren!
Vielleicht könnte jemand eine Idee. Ich möchte das Äquivalent haben:
Wählen Sie NVL (c1, c2) von MyTable
Lösung
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;
oder - weniger allgemein:
-- @(#)$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;
Die CHAR-Version kann für fast jede Art verwendet wird (mit Ausnahme von Strings länger als 32, wie geschrieben), da SE bei der Umwandlung zwischen Typen sehr gut. SE nicht explizit Casting unterstützen, entweder -. Es ist sicher anzunehmen, dass SE nicht viel von SQL letzten SQL-89 hat
Andere Tipps
Wenn Sie einen Blick auf die IIUG Website im Bereich Downloads, Sie ‚ll eine Sammlung von SPL-Routinen finden sich diese und andere Funktionen zu emulieren. Die spezifische sind Sie nach ist die Sammlung namens „orclproc“.