Informix: Selezionare problema nullo
Domanda
Utilizzando Informix, ho creato una tabella temporanei, che sto cercando di compilare da una dichiarazione prescelta. Dopo questo, voglio fare un aggiornamento, per popolare più campi nella tabella temporanei.
Così sto facendo qualcosa di simile;
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
Ma non è possibile selezionare nulla.
Per esempio:
select first 1 current from systables
opere, ma
select first 1 null from systables
fallisce!
(Non fatemi parlare sul perché non posso fare uno SQL Server come "selezionare la corrente" con nessuna tabella specificato!)
Soluzione
Questa pagina dice che la ragione per cui non si può fare che è perché "NULL" non avere un tipo. Quindi, la soluzione è quella di creare uno sProc che restituisce semplicemente NULL nel tipo desiderato.
Che suona come una brutta soluzione per me però. Forse si potrebbe creare una variabile nello script, impostarlo su null, quindi selezionare quella variabile invece? Qualcosa di simile a questo:
DEFINE dummy INT;
LET dummy = NULL;
SELECT group_ser, item_ser, dummy
FROM sometable
Altri suggerimenti
Non è necessario scrivere una stored procedure; è sufficiente per dire che tipo IDS il NULL è. Supponendo che non si utilizza IDS 7.31 (che non supporta alcuna notazione getto), è possibile scrivere:
SELECT NULL::INTEGER FROM dual;
SELECT CAST(NULL AS INTEGER) FROM dual;
E, se non si dispone di dual
come una tabella (che probabilmente non), si può fare una delle poche cose:
CREATE SYNONYM dual FOR sysmaster:"informix".sysdual;
La tabella 'sysdual' stato aggiunto in tempi relativamente recenti (IDS 11.10, IIRC), quindi se si utilizza una versione precedente, esso non esiste. Le seguenti opere con qualsiasi versione di IDS -. È quello che io 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 avete intenzione di scegliere tra systables per ottenere una singola riga, si dovrebbe includere 'WHERE tabid = 1
'; questa è la voce per systables sé, e se non è presente, il fatto che la vostra istruzione SELECT fa tornare tutti i dati è l'ultimo dei tuoi problemi. (Non ho mai visto che come un errore, però.)
SELECT group_ser, item_ser, replace(null,null) as my_null_column
FROM sometable
oppure è possibile utilizzare nvl(null,null)
per restituire un nulla per la vostra dichiarazione prescelta.
C'è qualche motivo per andare per una tabella effettiva? Sono stato con
select blah from table(set{1})
select blah from table(set{1})
è bello quando si utilizza 10.x database. Questa affermazione non tocca database. La quantità di operazioni di lettura / scrittura è uguale a 0,
ma
quando si utilizza 11.x vi costerà almeno 4500 buffer di legge perché questa versione di Informix crea questa tabella in memoria ed esegue query di esso.
select to_date(null) from table;
Questo funziona quando voglio ottenere un appuntamento con valore nullo
È possibile utilizzare questa espressione ( '' 1) sulla lista SELECT, invece di parola chiave null. Si restituisce valore NULL di tipo DECIMAL (2,0).
Questa ( '' 1,0001) restituisce DECIMAL (16,4). E così via.
Se si desidera DATA tipo Utilizza la data ( '' + 1) per ottenere valore nullo di tipo DATE.
( '' + 1) ||' 'Restituisce una stringa vuota di tipo VARCHAR (1).
Per ottenere il valore NULL di tipo VARCHAR (1) usa questa espressione: DATA ( '' + 1) ||' '
Funziona in 9.xe 11.x.