Question

En utilisant Informix, j'ai créé une table tempory que je suis en train de remplir d'une instruction select. Après cela, je veux faire une mise à jour, pour remplir plusieurs champs dans la table tempory.

Alors je fais quelque chose comme:

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

Mais vous ne pouvez pas sélectionner null.

Par exemple;

select first 1 current from systables

œuvres mais

select first 1 null from systables

échoue!

(Ne pas me commencer pourquoi je ne peux pas faire un serveur SQL comme « sélectionner le courant » sans table spécifiée!)

Était-ce utile?

La solution

Cette page indique la raison pour laquelle vous ne pouvez pas le faire est parce que « NULL » n'a pas un type. Ainsi, la solution consiste à créer un sproc qui retourne simplement NULL dans le type que vous voulez.

Cela ressemble à une solution assez mauvais pour moi si. Peut-être que vous pouvez créer une variable dans votre script, définissez à zéro, puis sélectionnez cette variable à la place? Quelque chose comme ceci:

DEFINE dummy INT;
LET dummy = NULL;

SELECT group_ser, item_ser, dummy
FROM sometable

Autres conseils

Vous ne devez pas écrire une procédure stockée; il vous suffit de dire IDS quel type NULL est. En supposant que vous n'utilisez pas IDS 7.31 (qui ne prend pas en charge la notation cast), vous pouvez écrire:

SELECT NULL::INTEGER FROM dual;

SELECT CAST(NULL AS INTEGER) FROM dual;

Et, si vous ne disposez pas d'une table comme dual (vous ne avez probablement pas), vous pouvez faire l'une des quelques petites choses:

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

Le tableau « sysdual » a été ajoutée relativement récemment (IDS 11.10, IIRC), donc si vous utilisez une version plus ancienne, il ne sera pas exister. Les travaux suivants avec une version d'IDS -. C'est ce que j'utilise

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

idiomatiques, si vous allez SELECT de SYSTABLES pour obtenir une seule ligne, vous devez inclure « WHERE tabid = 1 »; c'est l'entrée pour SYSTABLES lui-même, et si elle est manquante, le fait que votre instruction SELECT renvoie des toutes les données est le moindre de vos soucis. (Je ne l'ai jamais vu que comme une erreur, cependant.)

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

ou vous pouvez utiliser pour retourner une nvl(null,null) null pour votre instruction select.

Y at-il raison d'aller pour une table réelle? J'utilise

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

est agréable lorsque vous utilisez la base de données 10.x. Cette déclaration ne touche pas la base de données. La quantité d'opérations de lecture / écriture est égal à 0,

lorsque vous utilisez 11.x il vous en coûtera au moins 4500 tampon lit car cette version de Informix crée cette table en mémoire et exécute la requête contre.

select to_date(null) from table;

Cela fonctionne quand je veux obtenir une date avec la valeur NULL

Vous pouvez utiliser cette expression ( '' +1) sur la liste SELECT, au lieu de mot-clé null. Il évalue la valeur NULL de type DECIMAL (2,0).

( '' 1,0001) évalue à DECIMAL (16,4). Et ainsi de suite.

Si vous voulez utiliser DATE type DATE ( '' + 1) pour obtenir la valeur nulle de type DATE.

( '' + 1) || » 'Évalue à une chaîne vide de type VARCHAR (1).

Pour obtenir la valeur NULL de type VARCHAR (1) utiliser cette expression: DATE ( '' + 1) || »

Travaux dans 9.x et 11.x.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top