¿Cómo convertir sql-text a jsonb-string?

Nov 23 2020

No parece haber una forma obvia:

  • select 'a123'::text::jsonb= ERROR: sintaxis de entrada no válida para el tipo json
  • select '"a123"'::text::jsonb= Cadena MALA porque entre comillas,
    verifique select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
    que no entre comillas sea la correcta .
  • select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= NO cadena

Necesito '123' y 'a123' como cadenas JSONb puras .


PD: no es un duplicado de la conversión automática genérica de cualquier cosa .

Respuestas

1 ErwinBrandstetter Nov 23 2020 at 20:10

Para convertir literales de cadena sin tipo , que no están entre comillas dobles en jsonb(o json), use la función to_jsonb()(o to_json()):

SELECT to_jsonb(text 'a123');

Tenga en cuenta que la entrada tiene que ser un tipo de cadena ( text, varchar, ...), no un literal sin tipo. Así es como Postgres sabe que quieres una cadena JSON .

Lo anterior text 'a123'es una forma de emitir un literal sin tipo. Hay otros:

  • Conversión de tipo de datos de Postgres

Para una transmisión directa json(b), Postgres espera literales JSON válidos (con cadenas entre comillas dobles ):

SELECT '"a123"'::jsonb;  

Para traducir cada valor a una primitiva JSON específica, puede emitir condicionalmente antes de la conversión. Ejemplo:

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 = Cadena MALA porque se cita

Para ser precisos, el resultado no es una cadena, sino un jsonbvalor que contiene una cadena JSON. Para obtener la cadena como tipo de datos de Postgres text, necesita el ->>operador:

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

O (comparando valores JSON):

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

Necesito '123' y 'a123' como cadenas JSONb puras.

Entonces:

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

Ambos contienen cadenas JSON .

Esto también funciona:

SELECT '123'::jsonb;

.. pero contiene un JSON numérico .

Pero esto no funciona:

SELECT 'a123'::jsonb;  -- error

.. porque no es un literal numérico válido.

El manual tiene una tabla de asignaciones entre los tipos primitivos JSON y los tipos PostgreSQL correspondientes