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!)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top