Como converter sql-text para jsonb-string?

Nov 23 2020

Não parece haver uma maneira óbvia:

  • select 'a123'::text::jsonb= ERRO: sintaxe de entrada inválida para o tipo json
  • select '"a123"'::text::jsonb= Cadeia de caracteres RUIM porque entre aspas
    verifique select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
    se não entre aspas é o correto .
  • select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= NÃO string

Preciso de '123' e 'a123' como strings JSONb puras .


PS: não é uma duplicata da conversão genérica de qualquer coisa automática .

Respostas

1 ErwinBrandstetter Nov 23 2020 at 20:10

Para converter literais de string não digitados , que não estão entre aspas duplas para jsonb(ou json), use a função to_jsonb()(ou to_json()):

SELECT to_jsonb(text 'a123');

Note-se que a entrada tem que ser um tipo de cadeia ( text, varchar...), não um literal sem tipo. É assim que o Postgres sabe que você deseja uma string JSON .

A descrição acima text 'a123'é uma maneira de converter um literal sem tipo. Há outros:

  • Elenco de tipo de dados Postgres

Para uma conversão direta para json(b), Postgres espera literais JSON válidos (com strings entre aspas ):

SELECT '"a123"'::jsonb;  

Para traduzir cada valor para um primitivo JSON específico, você pode converter condicionalmente antes da conversão. Exemplo:

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 = String RUIM porque está entre aspas

Para ser mais preciso, o resultado não é uma string, mas um jsonbvalor contendo uma string JSON. Para obter a string como tipo de dados Postgres text, você precisa do ->>operador:

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

Ou (comparando valores JSON):

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

Preciso de '123' e 'a123' como strings JSONb puras.

Então:

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

Ambos contêm strings JSON .

Isso também funciona:

SELECT '123'::jsonb;

.. mas contém um numérico JSON .

Mas isso não funciona:

SELECT 'a123'::jsonb;  -- error

.. porque não é um literal numérico válido.

O manual tem uma tabela de mapeamentos entre tipos primitivos JSON e tipos correspondentes do PostgreSQL