Firebird 2.1存储的步骤以在多行上连接文本
-
28-09-2019 - |
题
我正在尝试编写一个存储过程,以将多行文本串在一起,以将其返回为单个字符串。例如:
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);
它总是返回零行。
有任何想法吗?
解决方案
你忘记了暂停。您的Proc应该看起来像这样:
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 ;!!
您无需存储Proc即可达到相同的结果。使用列表汇总函数:
SELECT LIST(text, '') FROM TEST where id=:iID
列表的第二个参数是定界符。如果您仅使用字段名称调用列表,则将使用逗号',将用于分离值。
其他提示
在这种情况下,现场测试可以BEN NULL,并且您不想设置整个结果,将使用:
CONCAT = CONCAT || coalesce(name,'');
代替
CONCAT = CONCAT || name;
不使用存储的Proc并使用版本Firebird 2.5, 列表 聚合函数将返回“列中非零值的逗号分隔字符串串联”*。使用上述测试表,SQL
SELECT LIST(TEXT)
FROM TEST
返回
第1行,第2行,第3行
这可能引起人们的兴趣。
*取自火鸟参考页面 这里
不隶属于 StackOverflow