如何将 sql-text 转换为 jsonb-string?

How to convert sql-text to jsonb-string?

似乎没有明显的方法:

我需要 '123' 和 'a123' 作为 纯 JSONb 字符串


PS:它不是 generic automatic-anything conversion 的副本。

要转换未类型化的 string literals, that are not wrapped in double-quotes to jsonb (or json), use the to_jsonb()(或 to_json())函数:

SELECT to_jsonb(text 'a123');

请注意,输入必须是字符串类型(textvarchar、...),而不是无类型文字。这就是 Postgres 知道你想要一个 JSON string.

的方式

上面的 text 'a123' 是一种转换无类型文字的方法。还有其他的:

  • Postgres data type cast

对于直接转换为 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 = BAD string because quoted

准确地说,结果不是一个字符串,而是一个包含JSON字符串的jsonb值。要将字符串作为 Postgres 数据类型 text,您需要 ->> 运算符:

select 'a123'::text  = ('{"x":"a123"}'::jsonb)->>'x'

或(比较 JSON 个值):

select '"a123"'::jsonb = ('{"x":"a123"}'::jsonb)->'x';

I need '123' and 'a123' as pure JSONb strings.

所以:

SELECT '"123"'::jsonb, '"a123"'::jsonb;

两者都包含JSON字符串.

这也有效:

SELECT '123'::jsonb;

.. 但包含一个 JSON numeric.

但这不起作用:

SELECT 'a123'::jsonb;  -- error

.. 因为它不是有效的数字文字。

手册在 JSON Primitive Types and Corresponding PostgreSQL Types

之间有 table 个映射