Как сделать оператор NVL (или DECODE или CASE) в SQL-запросе Informix SE? - PullRequest
1 голос
/ 25 июня 2009

IBM очень хорошо понимает его стандартный движок Informix, он не поддерживает ни CASE, ни DECODE. «Пожалуйста, обновите до новой версии»: 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 & rss2 *6 1003 *

Такого никогда не будет!

Так что, возможно, у кого-то может быть идея. Я хочу иметь эквивалент:

Выберите NVL (c1, c2) из ​​MyTable

Ответы [ 2 ]

3 голосов
/ 26 июня 2009
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;

Или - менее обычно:

-- @(#)$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;

Версия CHAR может использоваться практически для любого типа (за исключением строк длиннее 32, как написано), потому что SE очень хорошо конвертирует типы. SE также не поддерживает явное приведение - можно с уверенностью предположить, что в SE не так много SQL после SQL-89.

2 голосов
/ 26 июня 2009

Если вы заглянете на сайт IIUG в разделе загрузок, вы найдете там набор процедур SPL, чтобы подражать этим и другим функциям. Конкретный экземпляр, который вам нужен, - это коллекция, называемая orclproc.

...