Pet*_*uss 3 postgresql json types casting jsonb
似乎没有一个明显的方法:
select 'a123'::text::jsonb=错误:json 类型的输入语法无效select '"a123"'::text::jsonb= BAD 字符串,因为带引号的select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';=不是字符串我需要 '123' 和 'a123' 作为纯 JSONb 字符串。
PS:它不是通用自动任何转换的重复。
要将未用双引号括起来的无类型字符串文字转换为(or ),请使用(or ) 函数:jsonbjsonto_jsonb()to_json()
SELECT to_jsonb(text 'a123');
Run Code Online (Sandbox Code Playgroud)
请注意,输入必须是字符串类型(text, varchar, ...),而不是无类型文字。这就是 Postgres 知道您需要 JSON字符串的方式。
上面text 'a123'是转换非类型文字的一种方法。还有其他的:
对于直接转换为json(b),Postgres 需要有效的 JSON 文字(带有双引号字符串):
SELECT '"a123"'::jsonb;
Run Code Online (Sandbox Code Playgroud)
要将每个值转换为特定的 JSON 原语,您可以在转换之前进行条件转换。例子:
SELECT to_jsonb(text 'a123');
Run Code Online (Sandbox Code Playgroud)
select '"a123"'::text::jsonb= 错误的字符串,因为带引号
准确地说,结果不是一个字符串,而是一个jsonb包含 JSON 字符串的值。要将字符串获取为 Postgres 数据类型text,您需要->>运算符:
select 'a123'::text = ('{"x":"a123"}'::jsonb)->>'x'
Run Code Online (Sandbox Code Playgroud)
或者(比较 JSON 值):
select '"a123"'::jsonb = ('{"x":"a123"}'::jsonb)->'x';
Run Code Online (Sandbox Code Playgroud)
我需要“123”和“a123”作为纯 JSONb 字符串。
所以:
SELECT '"123"'::jsonb, '"a123"'::jsonb;
Run Code Online (Sandbox Code Playgroud)
两者都包含 JSON字符串。
这也有效:
SELECT '123'::jsonb;
Run Code Online (Sandbox Code Playgroud)
..但包含一个 JSON numeric。
但这不起作用:
SELECT 'a123'::jsonb; -- error
Run Code Online (Sandbox Code Playgroud)
..因为它不是有效的数字文字。
该手册有一个JSON 基元类型和相应 PostgreSQL 类型之间的映射表