sql-textをjsonb-stringに変換する方法は?

Nov 23 2020

明白な方法はないようです:

  • select 'a123'::text::jsonb=エラー:タイプjsonの入力構文が無効です
  • select '"a123"'::text::jsonb=引用符で囲まれていないものが正しいことを確認するために引用符で囲まれたチェックを行うため、BAD文字列
    select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
  • select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';=文字列ではありません

純粋なJSONb文字列として「123」と「a123」が必要です。


PS:それは一般的な自動何でも変換の複製ではありません。

回答

1 ErwinBrandstetter Nov 23 2020 at 20:10

型なし変換するには、文字列リテラルされている、ではないに二重引用符で包まれたjsonb(またはjson)を、使用to_jsonb()(またはto_json())機能を:

SELECT to_jsonb(text 'a123');

入力が文字列型でなければならないことに注意してください(textvarchar、...)ではなく、型なしリテラル。これが、PostgresがJSON文字列が必要であることを認識する方法です。

上記text 'a123'は、型なしリテラルをキャストする1つの方法です。他にもあります:

  • Postgresデータ型キャスト

に直接キャストする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文字列

正確には、結果は文字列ではなくjsonb、JSON文字列を含む値です。文字列をPostgresデータ型として取得するにはtext、次の->>演算子が必要です。

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

または(JSON値の比較):

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

純粋なJSONb文字列として「123」と「a123」が必要です。

そう:

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

どちらにもJSON文字列が含まれています。

これも機能します:

SELECT '123'::jsonb;

..ただし、JSON数値が含まれています

しかし、これは機能しません:

SELECT 'a123'::jsonb;  -- error

..それは有効な数値リテラルではないためです。

マニュアルには、JSONプリミティブ型と対応するPostgreSQL型の間のマッピングの表があります