如何将 sql 文本转换为 jsonb 字符串?

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:它不是通用自动任何转换的重复。

Erw*_*ter 5

要将未双引号括起来的无类型字符串文字转换为(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 类型之间的映射表