【问题标题】:Firebird 2.1 stored procedure to concatenate text on multiple rowsFirebird 2.1 存储过程连接多行文本
【发布时间】:2011-05-15 19:36:00
【问题描述】:

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

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);

它总是返回零行。

有什么想法吗?

【问题讨论】:

    标签: stored-procedures concatenation firebird firebird2.1


    【解决方案1】:

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

    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,则逗号“,”将用于分隔值。

    【讨论】:

    • 您好 Andrei,SUSPEND 位有效,但 LIST 无效,因为您无法保证 Select 语句返回的行的顺序。如果您按 SEQ 列排序,则需要按它进行分组,这样就不会返回正确的结果。我已经尝试过这个想法,它会更有效率。顺便问一下,你是 GBS 的 Andrei K 吗?
    • Opps,对不起,错误的字母顺序 GSB。 Golden Software,白俄罗斯
    【解决方案2】:

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

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

    而不是

    CONCAT = CONCAT || name;
    

    【讨论】:

      【解决方案3】:

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

      SELECT LIST(TEXT)
          FROM TEST
      

      返回

      第 1 行、第 2 行、第 3 行

      这可能有点意思。

      *取自 Firebird 参考页 here

      【讨论】:

        猜你喜欢
        • 2015-07-28
        • 1970-01-01
        • 2023-03-09
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 2019-07-29
        相关资源
        最近更新 更多