web-dev-qa-db-ja.com

PostgreSQLで改行、改行、タブをエスケープする簡単な方法はありますか?

これらをエスケープして同様の文字列を表示したいとします

SELECT *
FROM ( VALUES
  (E'\r\n\t FOO BAR \t\n\r')
) AS t(str);

Cスタイルのエスケープを取得するにはどうすればよいですか、\r\n\t FOO BAR \t\n\rバックアウトしますか?

SELECT *
FROM ( VALUES
  (E'foo\nfoo',E'\n\tBAR\t','baz'),
  (E'quz','qaz','quz')
) AS t(x,y,z); 
  x  |        y         |  z  
-----+------------------+-----
 foo+|                 +| baz
 foo |         BAR      | 
 quz | qaz              | quz
(2 rows)

代わりにしたい.

  x       |        y         |  z  
----------+------------------+-----
 foo\nfoo | \n\tBAR          | baz
 quz      | qaz              | quz
(2 rows)
3
Evan Carroll

以下のように、文字列エスケープ構文とreplace(string,substring,replacement)関数を使用できます。

standard_conforming_stringsの設定に大きく依存していることに注意してください。 onである必要があります。詳細は herehere および here です。

postgres=# \d t
     Table "public.t"
 Column | Type | Modifiers 
--------+------+-----------
 s      | text | 

postgres=# SELECT s, md5( s ), replace( replace( replace( s, E'\n', '\n' ), E'\t', '\t' ), E'\r', '\r' ) FROM t;
    s     |               md5                |  replace   
----------+----------------------------------+------------
 newline:+| 75c093ed14f1239a3510006326a1a260 | newline:\n
          |                                  | 
 tab:     | 355393c5cab9aa324c6ec90682b13d7e | tab:\t
 cr:\r    | 094911687582e40cfeb6217f8c760543 | cr:\r
(3 rows)
2
filiprem

postgresqlはこれを行っていません。あなたはpsqlによってあなたに表されているようにデータを見ています。

しかし、バイトを表示したい場合は、データをバイトに変換し、それを見てください。

jasen=# set bytea_output to escape;
jasen=# SELECT 
     convert_to(x,'utf8') as x_bytes, 
     convert_to(y,'utf8') as y_bytes, 
     convert_to(z,'utf8') as z_bytes
FROM ( VALUES
  (E'foo\nfoo',E'\n\tBAR\t','baz'),
  (E'quz','qaz','quz')
) AS t(x,y,z); 
  x_bytes   |     y_bytes     | z_bytes 
------------+-----------------+---------
 foo\012foo | \012\011BAR\011 | baz
 quz        | qaz             | quz
0
Jasen