0

次の plpgsql 関数の結果を連結テキスト出力で出力したいと考えています。

どうすればいいですか?次のようなものが欲しいです:

output = output + 'new point';

これまでの私の機能:

DECLARE 
    descriptions text[];
    i text;
    counter int := 1;
    _r record;
    output text;

BEGIN

    descriptions = string_to_array(description, ',');

    FOREACH i IN ARRAY descriptions

    LOOP

        FOR _r IN EXECUTE 'select point_id as id, name_of_location as name, description as desc
                   from information_on_point_of_interest
                   where description = '''||descriptions[counter]||''''

        LOOP
            output := output + _r.id || ',' || _r.name || ',' || _r.desc || '|';

        END LOOP;

    END LOOP;

RETURN output;

END;

output := output + new pointサポートされていないようですか?

4

2 に答える 2

2

なんで?

を初期化しないため、関数は失敗しますoutput。結果が...になるため、NULL滞在として開始します。NULLNULL || anythingNULL

また、連結された列concat_ws()の任意の値の車を取るために使用する必要があります。NULL

適切なソリューション

この単純なSQLクエリを使用すると、達成しようとしていることをはるかに高速に(そして正しく)実行できます。

SELECT string_agg(concat_ws(',', point_id, name_of_location, description), '|')
FROM  (SELECT unnest(string_to_array(description_list, ',')) AS description) x
JOIN   information_on_point_of_interest USING (description);

説明のリストの名前を、description_list混乱を少なくするために変更しました。
マニュアルでこれらの機能について読んでください:

于 2013-03-17T13:23:39.250 に答える
1

concat 演算子は||SQL 標準です。

あなたの問題は、その変数を初期化しなかったため、何をしているのかということnull || textであり、null を何かと連結した結果は null です。次のように初期化する必要があります。

DECLARE 
    output text:='';

http://sqlfiddle.com/#!12/9e854/1

于 2013-03-17T13:06:52.417 に答える