Jak przekonwertować sql-text na jsonb-string?

Nov 23 2020

Wydaje się, że nie ma oczywistego sposobu:

  • select 'a123'::text::jsonb= BŁĄD: nieprawidłowa składnia wejściowa dla typu JSON
  • select '"a123"'::text::jsonb= BAD ciąg ponieważ cytowany
    check select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
    , aby zobaczyć, że niekwotowanym jest poprawna .
  • select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= NIE ciąg

Potrzebuję „123” i „a123” jako czystych ciągów JSONb .


PS: nie jest to duplikat ogólnej konwersji automatycznej na cokolwiek .

Odpowiedzi

1 ErwinBrandstetter Nov 23 2020 at 20:10

Aby przekonwertować nietypowe literały ciągów , które nie są opakowane w podwójne cudzysłowy, na jsonb(lub json), użyj funkcji to_jsonb()(or to_json()):

SELECT to_jsonb(text 'a123');

Należy pamiętać, że wejście musi być typu String ( text, varchar...), nie pozbawionym typu dosłowne. To jak Postgres zna chcesz JSON ciąg .

Powyższe text 'a123'jest jednym ze sposobów rzucenia literału bez typu. Są inni:

  • Rzutowanie typu danych Postgres

W przypadku bezpośredniego rzutowania na json(b)Postgres oczekuje prawidłowych literałów JSON (z ciągami w cudzysłowach ):

SELECT '"a123"'::jsonb;  

Aby przetłumaczyć każdą wartość na konkretny element podstawowy JSON, możesz rzutować warunkowo przed konwersją. Przykład:

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 = ZŁY ciąg znaków, ponieważ jest cytowany

Aby być precyzyjnym, wynik nie jest ciągiem, ale jsonbwartością zawierającą ciąg JSON. Aby uzyskać ciąg jako typ danych Postgres text, potrzebujesz ->>operatora:

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

Lub (porównując wartości JSON):

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

Potrzebuję „123” i „a123” jako czystych ciągów JSONb.

Więc:

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

Oba zawierają ciągi JSON .

Działa to również:

SELECT '123'::jsonb;

.. ale zawiera numeryczny kod JSON .

Ale to nie działa:

SELECT 'a123'::jsonb;  -- error

.. ponieważ nie jest to prawidłowy literał numeryczny.

Podręcznik zawiera tabelę mapowań między pierwotnymi typami JSON i odpowiadającymi im typami PostgreSQL