sql-text를 jsonb-string으로 변환하는 방법은 무엇입니까?

Nov 23 2020

분명한 방법은없는 것 같습니다.

  • select 'a123'::text::jsonb= 오류 : json 유형에 대한 잘못된 입력 구문
  • select '"a123"'::text::jsonb= 따옴표가 붙지 않은 문자열 이 올바른지
    확인 select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
    하기 때문에 잘못된 문자열 입니다.
  • select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= 문자열 아님

순수한 JSONb 문자열 로 '123'과 'a123'이 필요합니다 .


추신 : 일반적인 자동 변환 의 중복이 아닙니다 .

답변

1 ErwinBrandstetter Nov 23 2020 at 20:10

지정되지 않은 변환하려면 문자열 리터럴 된다, 하지 에 큰 따옴표로 감싸 jsonb(또는 json), 사용 to_jsonb()(또는 to_json()) 기능 :

SELECT to_jsonb(text 'a123');

입력 문자열 유형이어야 유의 ( text, varchar, ...)이 아닌 형식없는 문자. 이것이 Postgres가 JSON 문자열 을 원한다는 것을 아는 방법 입니다.

text 'a123'는 형식화되지 않은 리터럴을 캐스팅하는 한 가지 방법입니다. 다른 것들이 있습니다 :

  • 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 = 따옴표로 묶인 잘못된 문자열

정확히 말하면, 결과는 하지 문자열하지만 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 유형 간의 매핑 테이블이 있습니다.