Sql-text'i jsonb-string'e nasıl dönüştürebilirim?

Nov 23 2020

Görünüşe göre bariz bir yol yok:

  • select 'a123'::text::jsonb= HATA: json türü için geçersiz giriş sözdizimi
  • select '"a123"'::text::jsonb= KÖTÜ dize alıntı çünkü
    onay select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
    görmek olmayan alıntılanan doğrudur .
  • select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= NOT dizesi

Saf JSONb dizeleri olarak '123' ve ' a123'e ihtiyacım var .


Not: genel otomatik herhangi bir şey dönüşümünün bir kopyası değildir .

Yanıtlar

1 ErwinBrandstetter Nov 23 2020 at 20:10

Türsüz dönüştürmek için dize hazır edilir değil çift tırnak sarılmış jsonb(veya json) kullanın to_jsonb()(veya to_json()) işlevini:

SELECT to_jsonb(text 'a123');

Girdi bir dize türü olması gerektiğini unutmayın ( text, varchar, ...), değil Türlenmemiş değişmezi. Postgres, JSON dizesi istediğinizi bu şekilde bilir .

Yukarıdakiler text 'a123', yazılmamış bir değişmezi yapmanın bir yoludur. Başkaları da var:

  • Postgres veri türü dökümü

json(b)Postgres, doğrudan aktarım için geçerli JSON değişmez değerlerini (çift tırnaklı dizelerle ) bekler :

SELECT '"a123"'::jsonb;  

Her bir değeri belirli bir JSON ilkeline çevirmek için, dönüştürmeden önce koşullu olarak çevirebilirsiniz. Misal:

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 = KÖTÜ dizge çünkü tırnaklı

Kesin olmak gerekirse, sonuç bir dize değil , jsonbJSON dizesi içeren bir değerdir. Dizeyi Postgres veri türü olarak almak textiçin ->>operatöre ihtiyacınız vardır :

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

Veya (JSON değerlerini karşılaştırarak):

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

Saf JSONb dizeleri olarak '123' ve 'a123'e ihtiyacım var.

Yani:

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

Her ikisi de JSON dizeleri içerir .

Bu aynı zamanda çalışır:

SELECT '123'::jsonb;

.. ancak bir JSON sayısal içerir .

Ancak bu işe yaramıyor:

SELECT 'a123'::jsonb;  -- error

.. çünkü geçerli bir sayısal harf değildir.

Kılavuz, JSON İlkel Türleri ve Karşılık Gelen PostgreSQL Türleri arasında bir eşleştirme tablosuna sahiptir.