要将未包含在双引号中的未类型化字符串字面值转换为jsonb
(或json
),请使用to_jsonb()
(或to_json()
)函数:
SELECT to_jsonb(text 'a123');
请注意,输入必须是字符串类型(
text
,
varchar
等),而不是无类型文字。这就是Postgres知道您想要JSON字符串的方式。
上述的
text 'a123'
是将无类型文字转换为字符串的一种方法。还有其他方法:
对于直接转换为
json(b)
,Postgres需要有效的JSON文字(带有双引号的字符串):
SELECT '"a123"'::jsonb;
为了将每个值转换为特定的JSON基本类型,您可以在转换之前进行条件转换。例如:
SELECT p, CASE WHEN i>2 THEN to_jsonb(p::numeric) ELSE to_jsonb(p) END AS x
FROM unnest('{ab,12,12,1.2}'::text[]) WITH ORDINALITY t(p,i);
select '"a123"'::text::jsonb
= 引号包裹的字符串是不正确的,原因是JSON格式化错误。
准确来说,结果并不是一个字符串,而是一个包含JSON字符串的jsonb
值。如果想要以Postgres数据类型text
的形式获取字符串,需要使用->>
运算符:
select 'a123'::text = ('{"x":"a123"}'::jsonb)->>'x'
或者(比较JSON值):
select '"a123"'::jsonb = ('{"x":"a123"}'::jsonb)->'x';
我需要'123'和'a123'作为纯JSONb字符串。
因此:
SELECT '"123"'::jsonb, '"a123"'::jsonb;
两者都包含JSON 字符串。
这也可以使用:
SELECT '123'::jsonb;
...但其中包含一个JSON 数字。
但是这样做不起作用:
SELECT 'a123'::jsonb;
这是因为它不是有效的数字字面量。
手册中有一个映射表,在JSON原始类型和相应的PostgreSQL类型之间做映射