假设我有一个类型的值json,比方说y.例如,可以通过obj->'key'返回类型值的任何函数来获得这样的值json.
当转换为此值时,该值text包括引号,即 "y"代替y.在使用json类型是不可避免的情况下,这会产生问题,特别是当我们希望将值与文字字符串进行比较时,例如
select foo(x)='bar';
Run Code Online (Sandbox Code Playgroud)
该API头脑风暴页面提示一个from_json将智能解开JSON字符串的函数,但我怀疑这是尚未提供.与此同时,如何在没有引号的情况下将JSON字符串转换为文本?
要将值提取为文本,请使用#>>:
SELECT to_json('foo'::text) #>> '{}';
来自:Postgres:如何将 json 字符串转换为文本?
PostgreSQL 文档页面:https://www.postgresql.org/docs/11/functions-json.html
因此它专门解决了您的问题,但它不适用于任何其他类型,例如整数或浮点数。该#>运算符也不适用于其他类型。
由于JSON只有一种数字类型“number”,并且没有 int 或 float 的概念,因此没有明显的方法将 JSON 类型转换为“正确”的数字类型。最好了解 JSON 的架构,提取文本,然后转换为正确的类型:
SELECT (('{"a":2.01}'::json)->'a'#>>'{}')::float
然而,PostgreSQL 的“数字”类型确实支持“任意精度数字”(“小数点前最多 131072 位;小数点后最多 16383 位” )。JSON 还支持大数字的“e”表示法。
尝试这个来测试它们:
SELECT (('{"a":2e99999}'::json)->'a'#>>'{}')::numeric
在->>操作正确解开引号.为了利用该运算符,我们将值包含在数组中,然后将其转换为json.
CREATE OR REPLACE FUNCTION json2text(IN from_json JSON)
RETURNS TEXT AS $$
BEGIN
RETURN to_json(ARRAY[from_json])->>0;
END; $$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
为了完整起见,我们提供了一个CAST利用上述功能的方法.
CREATE CAST (json AS text) WITH json2text(json) AS ASSIGNMENT;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3007 次 |
| 最近记录: |