3

我正在尝试编写一个存储过程来将多行文本连接在一起以将其作为单个字符串返回。例如:

CREATE TABLE TEST (
 ID INTEGER,
 SEQ INTEGER,
 TEXT VARCHAR(255));

COMMIT;

INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 1, "LINE 1");
INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 2, "LINE 2");
INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 3, "LINE 3");

COMMIT;

SET TERM !!;
CREATE PROCEDURE concat_names (iID INTEGER)
  RETURNS (CONCAT VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(255);
BEGIN
  CONCAT = '';
  FOR SELECT TEXT FROM TEST where id=:iID INTO :name
  DO BEGIN
    CONCAT = CONCAT || name;
  END
END!!
SET TERM ;!!

commit;

但是,当我运行时:

select concat from concat_names(1);

它总是返回零行。

有任何想法吗?

4

3 回答 3

8

你忘了暂停。你的过程应该是这样的:

SET TERM !!;
CREATE PROCEDURE concat_names (iID INTEGER)
  RETURNS (CONCAT VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(255);
BEGIN
  CONCAT = '';
  FOR SELECT TEXT FROM TEST where id=:iID INTO :name
  DO BEGIN
    CONCAT = CONCAT || name;
  END
  SUSPEND;
END!!
SET TERM ;!!

您可以在没有存储过程的情况下获得相同的结果。使用 LIST 聚合函数:

SELECT LIST(text, '') FROM TEST where id=:iID 

LIST 的第二个参数是分隔符。如果您只使用字段名称调用 LIST,则逗号 ',' 将用于分隔值。

于 2010-11-25T18:20:43.173 回答
0

如果字段 TEST 可以为 null 并且您不想将整个结果设置为 null ,则使用它很有用:

 CONCAT = CONCAT || coalesce(name,'');

代替

CONCAT = CONCAT || name;
于 2010-11-28T11:35:40.200 回答
0

在不使用存储过程和使用 Firebird 2.5 版本的情况下,LIST聚合函数将返回“列中非 NULL 值的逗号分隔字符串连接”*。使用前面提到的 TEST 表,SQL

SELECT LIST(TEXT)
    FROM TEST

返回

1号线、2号线、3号线

这可能会引起一些兴趣。

*取自这里的火鸟参考页面

于 2016-03-05T21:48:30.013 回答