2017-09-26 631 views
0

我有一個從社交媒體填充的非常大的數據庫。我正在嘗試創建一個新列來爲word_counter創建JSON以加快分析速度。在PostgreSQL中轉義字符

我第一次在PostgreSQL中創建一個函數來獲取字符串數組,計算出現次數並返回一個插入的jsonb。以下是功能

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; 

這是問題所在。當運行下面的查詢

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

limit 10 

我得到這個錯誤

[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 

我試圖逃避列,然後正則表達式替換一些項目,但還沒有工作。

+0

'to_json'將執行轉義爲您服務。 – teppic

回答

1

to_json功能可以用來逃生的文字:

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

然後

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

結果

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