Postgresql

您如何取消來自函式的“類似 C 的反斜杠轉義序列”?

  • June 9, 2017

這將取消\n\n序列。

SELECT E'\n\nFOO';

但是如果同樣的序列來自一個函式,你會怎麼做。

CREATE FUNCTION asdf() RETURNS text
AS $$
 SELECT '\n\nFOO'::text
$$ LANGUAGE 'sql';

Pg 似乎沒有向 SQL 公開其字元串解析/詞法分析。它有quote_literal等,但似乎沒有相反的情況。所以我不知道另一種方法可以做到這一點,而無需突破 PL 或編寫簡單的 C 擴展。

例如

CREATE OR REPLACE FUNCTION pyunquote(quoted text) RETURNS text AS $$
return quoted.decode("string-escape")
$$ LANGUAGE plpythonu;

然後

test=# SELECT pyunquote('\n\nAAA');
pyunquote 
-----------
         +
         +
AAA
(1 row)

請注意,這使用 Python 的字元串轉義規則,而不是 PostgreSQL 的。

要獲取 PostgreSQL 的規則,您可以使用以下非常不安全的方法並信任該函式傳遞給您的任何內容:

DO
LANGUAGE plpgsql
$$
DECLARE
 x text;
BEGIN
 EXECUTE format('SELECT E''%s''', '\n\nFOO') INTO x;
 RAISE NOTICE 'value is "%"', x;
END;
$$;

但是當然有人可以通過';DROP TABLE customer;--,這不會很有趣

引用自:https://dba.stackexchange.com/questions/175839