Вопрос

Используя Informix, я создал временную таблицу, которую пытаюсь заполнить с помощью инструкции select .После этого я хочу выполнить обновление, чтобы заполнить больше полей во временной таблице.

Итак, я делаю что-то вроде;

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

Но вы не можете выбрать null.

Например;

select first 1 current from systables

работает, но

select first 1 null from systables

терпит неудачу!

(Не заставляйте меня начинать с того, почему я не могу просто создать SQL Server типа "выбрать текущий" без указания таблицы!)

Это было полезно?

Решение

Эта страница говорит, что причина, по которой вы не можете этого сделать, заключается в том, что у "NULL" нет типа.Итак, обходной путь заключается в создании sproc, который просто возвращает NULL в нужном вам типе.

Хотя для меня это звучит как довольно плохое решение.Может быть, вы могли бы создать переменную в своем скрипте, присвоить ей значение null, а затем выбрать вместо нее эту переменную?Что- то вроде этого:

DEFINE dummy INT;
LET dummy = NULL;

SELECT group_ser, item_ser, dummy
FROM sometable

Другие советы

Вам не нужно писать хранимую процедуру;вам просто нужно указать IDS, к какому типу относится значение NULL.Предполагая, что вы не используете IDS 7.31 (который не поддерживает никаких приведенных обозначений), вы можете написать:

SELECT NULL::INTEGER FROM dual;

SELECT CAST(NULL AS INTEGER) FROM dual;

И, если у вас нет dual в качестве таблицы (у вас, вероятно, ее нет) вы можете выполнить одно из нескольких действий:

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

Таблица 'sysdual' была добавлена относительно недавно (IDS 11.10, IIRC), поэтому, если вы используете более старую версию, она не будет существовать.Следующее работает с любой версией IDS - это то, что я использую.

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

Идиоматически, если вы собираетесь ВЫБРАТЬ из системных таблиц, чтобы получить одну строку, вы должны включить 'WHERE tabid = 1';это запись для самой Systables, и если она отсутствует, тот факт, что ваш оператор SELECT возвращает какие-либо данные, является наименьшей из ваших проблем.(Однако я никогда не рассматривал это как ошибку.)

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

или вы можете использовать nvl(null,null) чтобы вернуть значение null для вашего оператора select.

Есть ли какая-то причина пойти за настоящим столом?Я использовал

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

это приятно, когда вы используете базу данных 10.x.Это утверждение не касается базы данных.Количество операций чтения/записи равно 0,

но

когда вы используете 11.x, это будет стоить вам как минимум 4500 операций чтения из буфера, потому что эта версия Informix создает эту таблицу в памяти и выполняет запрос к ней.

select to_date(null) from table;

Это работает, когда я хочу получить дату с нулевым значением

Вы можете использовать это выражение ("+1) в списке ВЫБОРА вместо ключевого слова null.Он принимает значение NULL типа DECIMAL(2,0).

Это ("+1.0001) вычисляется как ДЕСЯТИЧНОЕ число (16,4).И так далее.

Если вы хотите ввести дату, используйте DATE("+ 1), чтобы получить нулевое значение типа DATE.

("+1)||' ' вычисляется как пустая строка типа VARCHAR(1).

Чтобы получить НУЛЕВОЕ значение типа VARCHAR(1), используйте это выражение:ДАТА("+1)||' '

Работает в 9.x и 11.x.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top