Informix:选择null问题

时间:2009-03-20 12:32:38

标签: sql select informix

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

7 个答案:

答案 0 :(得分:17)

您不必编写存储过程;你只需告诉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语句确实返回任何数据这一事实是你的麻烦最少。 (但我从来没有把这看作是一个错误。)

答案 1 :(得分:5)

This page说你不能这样做的原因是因为“NULL”没有类型。因此,解决方法是创建一个只需要在所需类型中返回NULL的sproc。

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

DEFINE dummy INT;
LET dummy = NULL;

SELECT group_ser, item_ser, dummy
FROM sometable

答案 2 :(得分:3)

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

或者您可以使用nvl(null,null)为select语句返回null。

答案 3 :(得分:2)

有没有理由去实际的桌子?我一直在使用

select blah from table(set{1})

答案 4 :(得分:1)

select blah from table(set{1})
使用10.x数据库时,

很不错。此声明不涉及数据库。读/写操作量等于0,

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

答案 5 :(得分:0)

select to_date(null) from table;

当我想获得一个空值为

的日期时,这是有效的

答案 6 :(得分: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。