5

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

4

7 回答 7

23

您不必编写存储过程;您只需告诉 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 中 SELECT 以获取单行,则应包括 ' WHERE tabid = 1'; 这是 Systables 本身的条目,如果缺少它,您的 SELECT 语句确实返回任何数据这一事实是您最不麻烦的事情。(不过,我从未将其视为错误。)

于 2009-03-20T22:58:35.280 回答
5

这个页面说你不能这样做的原因是因为“NULL”没有类型。因此,解决方法是创建一个 sproc,它只以您想要的类型返回 NULL。

不过,这听起来对我来说是一个非常糟糕的解决方案。也许您可以在脚本中创建一个变量,将其设置为 null,然后选择该变量?像这样的东西:

DEFINE dummy INT;
LET dummy = NULL;

SELECT group_ser, item_ser, dummy
FROM sometable
于 2009-03-20T12:42:40.300 回答
3
SELECT group_ser, item_ser, replace(null,null) as my_null_column
FROM sometable

或者您可以使用nvl(null,null)为您的选择语句返回空值。

于 2010-07-14T17:28:12.643 回答
2

有什么理由去一张实际的桌子吗?我一直在使用

select blah from table(set{1})
于 2009-04-06T16:59:24.483 回答
1
select blah from table(set{1})

当您使用 10.x 数据库时很好。该语句不涉及数据库。读/写操作量等于0,

当您使用 11.x 时,它将花费您至少 4500 次缓冲区读取,因为此版本的 Informix 在内存中创建此表并对其执行查询。

于 2012-05-31T07:35:56.380 回答
0
select to_date(null) from table;

当我想获得一个空值的日期时,这很有效

于 2013-04-15T16:01:57.807 回答
0

您可以在 SELECT 列表上使用此表达式 (''+1),而不是 null 关键字。它评估为 DECIMAL(2,0) 类型的 NULL 值。

这 (''+1.0001) 的计算结果为 DECIMAL(16,4)。等等。

如果您想要 DATE 类型,请使用 DATE(''+1) 来获取 DATE 类型的空值。

(''+1)||' ' 计算为 VARCHAR(1) 类型的空字符串。

要获得 VARCHAR(1) 类型的 NULL 值,请使用以下表达式:DATE(''+1)||' '

适用于 9.x 和 11.x。

于 2014-03-17T14:36:08.137 回答