Postgres : json 문자열을 텍스트로 변환하는 방법은 무엇입니까?


94

Json 값은 문자열 값으로 구성 될 수 있습니다. 예 :

postgres=# SELECT to_json('Some "text"'::TEXT);
     to_json
-----------------
 "Some \"text\""

해당 문자열을 postgres 텍스트 값으로 추출하려면 어떻게해야합니까?

::TEXT작동하지 않습니다. 원래 문자열이 아닌 인용 된 json을 반환합니다.

postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
     to_json
-----------------
 "Some \"text\""

감사.

PS PostgreSQL 9.3을 사용하고 있습니다.


stackoverflow.com/q/19414361/562459 가 도움이 될 수 있습니다. 그렇지 않을 수 있습니다.
Mike Sherrill 'Cat Recall'2014

문자열 배열의 유사한 문제, stackoverflow.com/q/45243186/287948
Peter Krauss

답변:


58

PostgreSQL에서는 스칼라 JSON 객체를 분해 할 방법이 없습니다. 따라서 지적했듯이

select  length(to_json('Some "text"'::TEXT) ::TEXT);

15입니다.

트릭은 JSON을 하나의 JSON 요소의 배열로 변환 한 다음 ->>.

select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );

11을 반환합니다.


8
json_extract_path_text()루트 요소 (AFAIK)를 참조 할 수없는 것은 유감입니다 .
Erwin Brandstetter

3
흥미롭게도,이 분명히 다시 기능이있는 2012 년 API 설계 단계에서 브레인 스토밍 토론했다 from_json제안되었다,하지만 구현되지 wiki.postgresql.org/wiki/JSON_API_Brainstorm
니콜라

152

9.4.4에서 #>>연산자를 사용하면 나를 위해 작동합니다.

select to_json('test'::text) #>> '{}';

테이블 열과 함께 사용하려면 :

select jsoncol #>> '{}' from mytable;

2
Postgres 9.4에서 가장 간단한 솔루션 인 것 같습니다. 그러나 9.3에서는 작동하지 않습니다.
e79ene 2015-08-14

2
@hasen OP는 그가 JSON 값에서 텍스트를 추출하려고한다고 말하며 to_json(...)짧은 한 줄 문에서 예제로 사용할 JSON 값을 만드는 간단한 방법입니다. 설명하는대로 테이블을 쿼리하는 경우 확실히 JSON 열의 이름으로 바꿀 것입니다. 또한 잠재적 인 혼동의 지점을 정리하기 (...)::text위해 #>>연산자가 정의에 따라 텍스트를 반환 하므로 캐스트 가 중복됩니다 (처음에 연산자를 사용하는 이유). 괄호를 유지하고 캐스트를 삭제할 수 ::text있습니다.
Ian Timothy

1
누군가가 무엇을 #>>하고 무엇을 하고 있는지 철자 할 수 '{}'있습니까? 나는 이것을 따라갈 수 없으며 어느 용어도 Google 친화적이지 않습니다. 이 답변은 내 문제를 해결했으며 이유를 알고 싶습니다.
valadil

1
@valadil #>>운영자를 위한 문서 는 여기에 있습니다 .
Ian Timothy

1
@valadil이 경우 최상위 수준 또는 루트 JSON 개체가 text있습니다. 문자열처럼 보이지만 JSON 객체입니다. 해당 객체를 JSON에서 텍스트로 변환하려면 #>>연산자를 사용하십시오 . 그러나 해당 연산자는 경로를 지정해야합니다. 해당 루트 개체의 경로는 {}입니다. 따라서 SELECT '"test"'::jsonb #>> '{}'"루트 경로에서 개체를 가져와 텍스트로 변환"을 의미합니다.
Ian Timothy

3

큐리어스 씨도 이것에 대해 궁금했습니다. #>> '{}'연산자 외에도 9.6 이상 에서는 연산자를 사용하여 jsonb 문자열의 값을 가져올 수 있습니다 ->>.

select to_jsonb('Some "text"'::TEXT)->>0;
  ?column?
-------------
 Some "text"
(1 row)

json 값이있는 경우 솔루션은 먼저 jsonb로 캐스트하는 것입니다.

select to_json('Some "text"'::TEXT)::jsonb->>0;
  ?column?
-------------
 Some "text"
(1 row)

0

이 작업을 수행하는 쉬운 방법 :

SELECT  ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;

json 문자열을 json 목록으로 변환하십시오.


0

->> 나를 위해 작동합니다.

postgres 버전 :

<postgres.version>11.6</postgres.version>

질문:

select object_details->'valuationDate' as asofJson, object_details->>'valuationDate' as asofText from MyJsonbTable;

산출:

  asofJson       asofText
"2020-06-26"    2020-06-26
"2020-06-25"    2020-06-25
"2020-06-25"    2020-06-25
"2020-06-25"    2020-06-25

지적 해 주셔서 감사합니다. 위 버전을 수정했습니다
Surinder

원래 질문은 (객체 키 없음)을 사용하여 JSON 문자열의 값을 텍스트로 가져 오는 방법입니다. 이 대답은 키를 사용할 때 ->->>사용할 때 의 차이 입니다. 이 답변 또는 이 답변을 참조하십시오 .
Ian Timothy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.