Pergunta

Usando o Informix, eu criei uma tabela tempory que estou tentando preencher a partir de uma instrução SELECT. Depois disso, eu quero fazer uma atualização, para preencher mais campos na tabela tempory.

Então, eu estou fazendo algo parecido;

create temp table _results (group_ser int, item_ser int, restype char(4));

insert into _results (group_ser, item_ser)
select 
      group_ser, item_ser, null
from
      sometable

Mas você não pode selecionar nulo.

Por exemplo;

select first 1 current from systables

funciona, mas

select first 1 null from systables

falha!

(Não me fale sobre por que eu não posso apenas fazer um SQL Server como "escolha atual" sem tabela especificada!)

Foi útil?

Solução

Esta página diz a razão que você não pode fazer isso é porque "NULL" não tem um tipo. Assim, a solução é criar um sproc que simplesmente retorna NULL no tipo que você deseja.

Isso soa como uma solução muito ruim para mim embora. Talvez você poderia criar uma variável no seu script, defina-o como nulo, em seguida, selecione essa variável em vez disso? Algo parecido com isto:

DEFINE dummy INT;
LET dummy = NULL;

SELECT group_ser, item_ser, dummy
FROM sometable

Outras dicas

Você não tem que escrever um procedimento armazenado; você simplesmente tem que dizer IDS que digite o NULL é. Supondo que você não está usando IDS 7,31 (que não suporta qualquer notação elenco), você pode escrever:

SELECT NULL::INTEGER FROM dual;

SELECT CAST(NULL AS INTEGER) FROM dual;

E, se você não tem dual como uma mesa (provavelmente não), você pode fazer uma das poucas coisas:

CREATE SYNONYM dual FOR sysmaster:"informix".sysdual;

A tabela 'sysdual' foi adicionado relativamente pouco tempo (IDS 11.10, IIRC), então se você estiver usando uma versão mais antiga, não vai existir. Os seguintes trabalhos com qualquer versão do IDS. - É o que eu uso

-- @(#)$Id: dual.sql,v 2.1 2004/11/01 18:16:32 jleffler Exp $
-- Create table DUAL - structurally equivalent to Oracle's similarly named table.
-- It contains one row of data.

CREATE TABLE dual
(
    dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY
) EXTENT SIZE 8 NEXT SIZE 8;
INSERT INTO dual VALUES('x');

REVOKE ALL ON dual FROM PUBLIC;
GRANT SELECT ON dual TO PUBLIC;

Idiomaticamente, se você está indo para selecionar a partir systables para obter uma única linha, você deve incluir 'WHERE tabid = 1'; esta é a entrada para si systables, e se ele estiver ausente, o fato de que sua instrução SELECT faz retornar todos os dados é o menor dos seus problemas. (Eu nunca vi isso como um erro, no entanto.)

SELECT group_ser, item_ser, replace(null,null) as my_null_column
FROM sometable

ou você pode usar nvl(null,null) retornar nulo para sua instrução select.

Existe alguma razão para ir para uma tabela real? Tenho vindo a utilizar

select blah from table(set{1})
select blah from table(set{1})

é bom quando você estiver usando 10.x banco de dados. Esta declaração não toca banco de dados. A quantidade de operações de leitura / gravação é igual a 0,

e

quando você está usando 11.x vai custar-lhe pelo menos 4500 tampão lê porque esta versão do Informix cria esta tabela na consulta de memória e executa contra ela.

select to_date(null) from table;

Isso funciona quando eu quiser obter uma data com valor nulo

Você pode usar esta expressão ( '' +1) na lista SELECT, em vez de palavra-chave null. Ele avalia a valor NULL do tipo DECIMAL (2,0).

Este ( '' 1,0001) avalia para decimal (16,4). E assim por diante.

Se você quiser DATA tipo de uso DATE ( '' + 1) para obter valor nulo do tipo DATE.

( '' + 1) ||' "Avaliada como uma cadeia vazia do tipo VARCHAR (1).

Para obter o valor NULL do tipo VARCHAR (1) usar esta expressão: DATA ( '' + 1) ||' '

Obras em 9.xe 11.x.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top