Informix: выберите нулевую задачу - PullRequest
4 голосов
/ 20 марта 2009

Используя 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

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

Например;

select first 1 current from systables

работает, но

select first 1 null from systables

не удается!

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

Ответы [ 7 ]

17 голосов
/ 21 марта 2009

Вам не нужно писать хранимую процедуру; Вы просто должны сказать 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;

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

5 голосов
/ 20 марта 2009

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

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

DEFINE dummy INT;
LET dummy = NULL;

SELECT group_ser, item_ser, dummy
FROM sometable
3 голосов
/ 14 июля 2010
SELECT group_ser, item_ser, replace(null,null) as my_null_column
FROM sometable

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

2 голосов
/ 06 апреля 2009

Есть ли какая-либо причина, чтобы пойти на фактический стол? Я использовал

select blah from table(set{1})
1 голос
/ 31 мая 2012
select blah from table(set{1})

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

но

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

0 голосов
/ 17 марта 2014

Вы можете использовать это выражение ('' +1) в списке SELECT вместо ключевого слова null. Он оценивается как значение NULL типа DECIMAL (2,0).

Это ('' +1,0001) оценивается как ДЕСЯТИЧНЫЙ (16,4). И так далее.

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

( '' + 1) ||» 'возвращает пустую строку типа VARCHAR (1).

Чтобы получить значение NULL типа VARCHAR (1), используйте это выражение: ДАТА ( '' + 1) ||» «

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

0 голосов
/ 15 апреля 2013
select to_date(null) from table;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...