Informix: Wählen Sie null Problem
Frage
Mit Informix, ich habe eine tempory Tabelle erstellt, die ich von einer select-Anweisung zu füllen versuchen. Danach möchte ich ein Update tun, mehrere Felder in der tempory Tabelle zu füllen.
Also ich mache so etwas wie;
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
Sie können aber nicht null aus.
Zum Beispiel:
select first 1 current from systables
funktioniert, aber
select first 1 null from systables
versagt!
(Verstehen Sie mich nicht begonnen, warum kann ich nicht nur ein SQL Server tun wie „wählen Strom“ ohne Tabelle angegeben!)
Lösung
Diese Seite sagt der Grund, warum Sie das nicht tun kann, ist, weil „NULL“ kein Typ. Also, die Abhilfe ist eine sproc zu schaffen, die einfach NULL zurück in der Art Sie wollen.
Das klingt wie eine ziemlich schlechte Lösung für mich aber. Vielleicht könnten Sie eine Variable in Ihrem Skript erstellen, setzen Sie ihn auf null, dann stattdessen diese Variable wählen? So etwas wie folgt aus:
DEFINE dummy INT;
LET dummy = NULL;
SELECT group_ser, item_ser, dummy
FROM sometable
Andere Tipps
Sie müssen nicht eine gespeicherte Prozedur schreiben; Sie müssen einfach IDS sagen, welche Art der NULL ist. Angenommen, Sie verwenden IDS nicht 7,31 (die keine Guss Notation unterstützt), können Sie schreiben:
SELECT NULL::INTEGER FROM dual;
SELECT CAST(NULL AS INTEGER) FROM dual;
Und wenn Sie nicht dual
als Tabelle (Sie wahrscheinlich nicht), können Sie eines der wenigen Dinge tun:
CREATE SYNONYM dual FOR sysmaster:"informix".sysdual;
Die "sysdual Tisch wurde vor relativ kurzer Zeit (IDS 11.10, IIRC) hinzugefügt, so dass, wenn Sie eine ältere Version verwenden, wird es nicht geben. Die folgenden Arbeiten mit jeder Version von IDS -. Es ist, was ich verwende
-- @(#)$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;
idiomatisch, wenn Sie von SYSTABLES SELECT werden eine einzelne Zeile zu erhalten, sollten Sie umfassen ‚WHERE tabid = 1
‘; dies ist der Eintrag für SYSTABLES selbst, und wenn es fehlt, wird die Tatsache, dass Ihre SELECT-Anweisung Keinerlei Daten zurückgeben ist die am wenigsten Ihrer Probleme. (Ich habe das nie als Fehler gesehen, though.)
SELECT group_ser, item_ser, replace(null,null) as my_null_column
FROM sometable
oder Sie können nvl(null,null)
verwenden, um eine Null für die select-Anweisung zurückzukehren.
Gibt es einen Grund für eine tatsächliche Tabelle zu gehen? Ich habe mit
select blah from table(set{1})
select blah from table(set{1})
ist schön, wenn man 10.x-Datenbank verwenden. Diese Aussage nicht berührt Datenbank. Die Menge der Lese- / Schreiboperationen gleich 0,
und
Wenn Sie 11.x verwenden wird es Ihnen mindestens 4500 Puffer kosten lesen, da diese Version von Informix Tabelle im Speicher erstellt und führt Abfrage dagegen.
select to_date(null) from table;
Das funktioniert, wenn ich ein Date mit Nullwert erhalten möchten
Sie können diesen Ausdruck verwenden ( ‚‘ + 1) auf der SELECT-Liste, anstelle von null Schlüsselwort. Es wird auf NULL Werte vom Typ DECIMAL (2,0).
Das ( '' 1,0001) ausgewertet DECIMAL (16,4). Und so weiter.
Wenn Sie DATE Typ Verwendung DATE möchten ( '' + 1) Nullwert vom Typ DATE zu erhalten.
( '' + 1) ||‘ "Wertet auf eine leere Zeichenfolge vom Typ VARCHAR (1).
Um NULL Werte vom Typ zu erhalten VARCHAR (1) verwendet diesen Ausdruck: DATE ( '' + 1) ||‘ ‚
Werke in 9.x und 11.x.