2017-09-26 1 views
0

Ich habe eine sehr große Datenbank von sozialen Medien bevölkert. Ich versuche eine neue Spalte zu erstellen, um JSON für word_counter für schnellere Analysen zu erstellen.Escaping Zeichen in PostgreSQL

Ich erstelle zuerst eine Funktion in PostgreSQL, um ein String-Array zu nehmen, die Vorkommnisse zu zählen und einen Jsonb zurückzugeben, der eingefügt wird. Hier ist die folgende Funktion

CREATE 
OR REPLACE FUNCTION count_elements (TEXT []) RETURNS JSONB AS $$ 
DECLARE js JSONB := '{}' ; 
DECLARE jjson JSONB ; 
BEGIN 
    SELECT 
     jsonb_agg (
     (
       '{"' || i|| '":"' || C || '"}' 
      ) :: JSONB 
     ) INTO jjson 
    FROM 
     (
      SELECT 
       i, 
       COUNT (*) C 
      FROM 
       (SELECT UNNEST($1 :: TEXT []) i) i 
      GROUP BY 
       i 
      ORDER BY 
       C DESC 
     ) foo ; RETURN jjson ; 
    END ; $$ LANGUAGE plpgsql; 

Hier ist das Problem. Wenn Sie die folgende Abfrage ausgeführt

select count_elements(string_to_array(lower(tweet_text), ' ')),tweet_text from tweet_database 

limit 10 

Ich erhalte diesen Fehler

[Err] ERROR: invalid input syntax for type json 
DETAIL: Character with value 0x0a must be escaped. 
CONTEXT: JSON data, line 1: {"winning? 
SQL statement "SELECT 

Ich versuchte, die Säule zu entkommen, und dann regex einige der Elemente zu ersetzen, aber es ist noch nicht gearbeitet hat.

+0

'to_json' für Sie entkommen wird ausführen. – teppic

Antwort

1

die to_json Funktion kann verwendet werden, um Text zu entkommen:

SELECT 
    jsonb_agg (
     (
     '{' || to_json(i) || ':' || C || '}' 
    ) :: JSONB 
) INTO jjson 

dann

select count_elements(E'{a, a, b, a\nb, a}'::text[]); 

Ergebnisse in

[{"a":3}, {"b":1}, {"a\nb":1}]