Informix - 使用子选择的结果更新SET列

时间:2011-03-28 19:22:59

标签: sql informix

我有一个带有集合列的表。我想做一个子选择,它返回几个整数并将结果放在该集合列中,但是我找不到通过SQL来完成它的语法。我通过编写一个执行相同操作的SQL过程(在SET变量中放置SELECT的结果并返回变量)来做到这一点,但是我试图在没有函数的情况下做同样的事情。可以吗?

首先,我创建一个临时表:

CREATE TEMP TABLE table1 (
  id INTEGER
, col2 SET(INT NOT NULL)
)

然后我填写测试数据:

INSERT INTO table1 (id) VALUES (1);
INSERT INTO table1 (id) VALUES (2);

现在这有效:

UPDATE table1 SET col2 = SET{1,2};

...但我正在尝试这样做而且它不起作用:

UPDATE table1 SET col2 = (SELECT id FROM table1) WHERE id = 1;

它返回此错误:

[Error Code: -9632, SQL State: IX000]  Value does not match the type of column (col2).

2 个答案:

答案 0 :(得分:1)

在纯SQL中操作SET类型是一件痛苦的事。

您的UPDATE正在尝试将INTEGER分配给SET OF INTEGER,错误显示“您不能这样做”。

你应该可以这样做:

UPDATE table1
   SET col2 = SET { (SELECT id FROM table1 WHERE id = 1) }
 WHERE id = 1;

但是,我不确定在集合中获取多个值的正确修改是什么。内在的WHERE不是空闲的。

答案 1 :(得分:1)

您可以使用 MULTISET ITEM 关键字来实现此目的 以下示例将起作用:

CREATE TEMP TABLE table1 (
  id INTEGER
  ,col2 MULTISET(INT NOT NULL)
);

INSERT INTO table1 (id) VALUES (1);
INSERT INTO table1 (id) VALUES (2);

UPDATE table1 SET col2 = MULTISET{1,2};

UPDATE table1
   SET col2 = MULTISET(SELECT ITEM id FROM table1)
WHERE id = 1;

请注意SET和MULTISET之间的区别

select set{1,2,1,3,1} from systables where tabid=1;

返回SET {1,2,3}

select multiset{1,2,1,3,1} from systables where tabid=1;

返回MULTISET {1,2,1,3,1}