【问题标题】:Informix: Select null problemInformix:选择空问题
【发布时间】:2010-10-14 12:52:02
【问题描述】:

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

【问题讨论】:

  • 仅供参考 - 我讨厌 informix!
  • 你不必爱它,但你最好理解它。 RDBM 允许用户从查询 (DESCRIBE) 中获取所有相关信息。这包括根据查询获取结果集中列的数量和类型。这就是允许完全动态 SQL 的原因(应用程序可以自行适应用户动态编写的查询)。您的查询的问题是 NULL 根据定义是无类型的。所以你的查询是不允许的。我很想知道其他 RDBM 是如何处理这个问题的……可能他们设置了默认类型……只需转换你的 NULL 就可以了。问候。

标签: sql select informix


【解决方案1】:

您不必编写存储过程;您只需告诉 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 语句确实返回任何数据这一事实是您最不麻烦的事情。 (不过,我从未将其视为错误。)

【讨论】:

  • 只使用 NULL::INTEGER 而不是 NULL 是最简单的,这比创建过程或其他答案中给出的其他示例要好。
【解决方案2】:

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

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

DEFINE dummy INT;
LET dummy = NULL;

SELECT group_ser, item_ser, dummy
FROM sometable

【讨论】:

  • +1 +答案。没试过,但你的回答很有道理。
  • 请注意,有问题的常见问题解答日期为 1998 年。从那时起有些事情发生了变化。
【解决方案3】:
SELECT group_ser, item_ser, replace(null,null) as my_null_column
FROM sometable

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

【讨论】:

    【解决方案4】:

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

    select blah from table(set{1})
    

    【讨论】:

      【解决方案5】:
      select blah from table(set{1})
      

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

      但是

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

      【讨论】:

        【解决方案6】:
        select to_date(null) from table;
        

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

        【讨论】:

          【解决方案7】:

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

          这个 (''+1.0001) 的计算结果为 DECIMAL(16,4)。以此类推。

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

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

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

          适用于 9.x 和 11.x。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-08-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多