Информикс:Выберите нулевую проблему
Вопрос
Используя 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.