Anführungszeichen aus String entfernen

Hi,

ich baue in meiner plpgsql-Funktion einen String aus einer SQL-Abfrage:

FOR mpvrec IN SELECT DISTINCT pv_id FROM historytodataset_coll
                                WHERE is_collection = TRUE 
                                AND table_id = mtablerec.table_id 
                                AND col_name = mcolsrec.col_name LOOP
    pvs_sql := pvs_sql || ''pv_id = '' || mpvrec.pv_id || '' OR '';
END LOOP;
pvs_sql := rtrim (pvs_sql, ''OR '');
        pvs_sql := pvs_sql || '')'';

Nun habe ich z.B. sowas wie “(pv_id=5 OR pv_id=12 OR pv_id 38)” dort stehen. Ich benötige jetzt diesen Teilstring in mehreren weiteren Abfragen. Wenn ich allerdings den String in die Abfrage einfüge:

sql := ''SELECT count(*) FROM history
                WHERE '' || pvs_sql || 
                '' AND "time" >='' || quote_literal(start_interval) || ... ;

, dann wird dieser String in Anführungszeichen geschrieben und die SQL-Abfrage sieht dann ungefähr so aus:

SELECT count(*) FROM history
                WHERE "(pv_id=5 OR pv_id=12 OR pv_id 38)" AND "time" >='2007-01-01' ...

Ich muss also irgendwie die Anführungszeichen aus meinen generierten String bekommen. Kann mir jemand sagen, wie ich das machen kann?

gruß chuqa

Mir ist grad nicht klar, wo die reinkommen. Vielleicht hilft Dir aber folgendes weiter:

test=*# select * from foo;
 id | a | b
----+---+---
  1 | 1 | 1
  2 | 1 | 2
  3 | 2 | 2
  4 | 2 | 3
  5 | 2 | 2
(5 rows)

create or replace function ff() returns text as $$
declare
        r       record;
        t       text;
        t2      text;
begin
        select into t2 array_to_string(ARRAY(select id from foo), ', ');
        t2 := '(' || t2 || ')';
        t := '(';
        for r in select id from foo loop
                t := t || 'id=' || r.id || ' or ';
        end loop;
        t := regexp_replace(t, ' or $', '');
        t := t || ')';
        return t || ' oder besser ' || t2;
end;
$$ language plpgsql;

test=*# select * from ff();
                                 ff
--------------------------------------------------------------------
 (id=1 or id=2 or id=3 or id=4 or id=5) oder besser (1, 2, 3, 4, 5)
(1 row)

Die Art, wie ich t2 bastle, sieht vielleicht a bissl eleganter aus, und du kannst das in Deinen selects nachfolgend als … in (…) einbauen. Das wird dann zwar eh wieder zu einem OR erweitert, aber imho sieht es erst mal aufgeräumter aus.

Warum verwendest Du kein Dollar-Quoting? Vielleicht hängt Dein Problem damit zusammen, daß Du es nicht nimmst, und da was flasch gequotet ist. Bin grad zu faul, das näher zu untersuchen…


Andreas

Hallo chuqa,

Doku, Kapitel 9.4. “String Functions and Operators”

Funktion: translate(string text, from text, to text)

Beispiel: translate(‘12"34"5"678"90"’, ‘"’, ‘’) ==> 1234567890




mfg

fristo

OK, es funktioniert jetzt.

Ich danke euch beiden :smiley:

gruß