Postgresql

取消引用 JSON 字元串;列印不帶引號的 JSON 字元串

  • November 11, 2021
SELECT json_array_elements('["one", "two"]'::json)

給出結果

| json_array_elements |
| :------------------ |
| “一個” |
| “二” |

我想要相同但沒有引號:

one
two

看起來我不能->>在這裡使用,因為我在 JSON 中沒有欄位名稱。它只是一個字元串數組。

Postgres 版本:x86_64-apple-darwin 上的 PostgreSQL 10.0,由 i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 編譯(基於 Apple Inc. build 5658)(LLVM build 2336.11.00),64-少量

預設json->text強制輸出帶有雙引號 ( "),因為強制text轉換為json字元串需要雙引號輸入。要擺脫雙引號,請使用TRIM

SELECT x, trim('"' FROM x::text)
FROM json_array_elements('["one", "two"]'::json) AS t(x);
  x   | btrim 
-------+-------
"one" | one
"two" | two
(2 rows)

但重要的一點是,如果你這樣做,你會失去一些效用。所有 JSONB 類型都以文本形式返回,可用於jsonb強制text->jsonb返回。這是一個雙射映射函式。失去那個意味著null"null"是一樣的,1和是一樣的"1"

SELECT x, trim('"' FROM x::text)
FROM json_array_elements('[null, "null", 1, "1"]') AS t(x);
  x    | btrim 
--------+-------
null   | null
"null" | null
1      | 1
"1"    | 1
(4 rows)

內裝..

如果你想知道發生了什麼。所有類型都可以提供一個_out將它們帶入text_send將它們帶入二進製表示和倒數_in以及_recv將它們從這些形式中取出並映射回類型。在這裡你得到jsonb_out

  1. jsonb_out呼叫_JsonbToCstring
  2. JsonbToCstring呼叫_JsonbToCStringWorker
  3. JsonbToCStringWorker呼叫_jsonb_put_escaped_value
  4. jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal)呼叫_escape_json
  5. escape_json(StringInfo buf, const char *str)添加了"並且它是硬編碼的。別無退路。

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