Como fazer uma NVL (ou DECODE ou CASE) declaração dentro de uma consulta Informix SE SQL?
Pergunta
IBM é muito clara em seu Motor padrão Informix, ele não suporta nenhum dos casos nem DECODE. "Por favor, atualize para uma nova versão": 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
Isso nunca vai acontecer!
Então, talvez alguém poderia ter uma idéia. Quero ter o equivalente a:
Selecionar NVL (c1, c2) a partir MyTable
Solução
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 - menos geral:
-- @(#)$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;
A versão CHAR podem ser usadas para quase qualquer tipo (excepto cadeias mais longas do que 32, como escrito) porque SE é muito bom em converter entre tipos. O SE não suporta conversão explícita, ou -., é seguro assumir que SE não tem muito de SQL passado SQL-89
Outras dicas
Se você tem um olhar sobre a IIUG site na área de downloads, você vai encontrar uma coleção de rotinas SPL lá para emular estas funções e outros. Um específico que você está depois é a coleção chamada "orclproc".