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
リストの2番目のパラメーターは区切り文字です。フィールド名のみでリストを呼び出すと、comma 'は、値を分離するために使用されます。
他のヒント
この場合、フィールドテストはベンナルを使用でき、結果全体をnullするように設定したくありません。使用すると便利です。
CONCAT = CONCAT || coalesce(name,'');
それ以外の
CONCAT = CONCAT || name;
保存されたProcを利用せず、バージョンFirebird 2.5を使用しないと、 リスト 集約関数は、「列内の非ヌル値のコンマ分離された文字列の連結」*を返します。前述のテストテーブル、SQLを使用します
SELECT LIST(TEXT)
FROM TEST
戻り値
1行目、2行目、3行目
これは興味深いかもしれません。
*Firebirdリファレンスページから取得 ここ
所属していません StackOverflow