Postgres 9.4 이상
이 글 에서 분명히 영감을 얻은 Postgres 9.4는 누락 된 기능을 추가
했습니다. 패치에 대한 Laurence Rowe와 커밋에 대한 Andrew Dunstan에게 감사드립니다!
JSON 배열을 숨기려면 그런 다음 array_agg()
또는 ARRAY 생성자 를 사용하여 Postgres 배열 을 빌드 하십시오. 또는 string_agg()
구축하는 text
문자열 .
LATERAL
상관 된 하위 쿼리 에서 행당 중첩되지 않은 요소를 집계 합니다. 그런 다음 원래의 순서는 유지됩니다 우리는 필요하지 않습니다 ORDER BY
, GROUP BY
또는 외부 쿼리의 경우에도 고유 키. 보다:
jsonb
다음의 모든 SQL 코드에서 'json'을 'jsonb'로 바꾸십시오 .
SELECT t.tbl_id, d.list
FROM tbl t
CROSS JOIN LATERAL (
SELECT string_agg(d.elem::text, ', ') AS list
FROM json_array_elements_text(t.data->'tags') AS d(elem)
) d;
짧은 구문 :
SELECT t.tbl_id, d.list
FROM tbl t, LATERAL (
SELECT string_agg(value::text, ', ') AS list
FROM json_array_elements_text(t.data->'tags') -- col name default: "value"
) d;
관련 :
상관 하위 쿼리의 ARRAY 생성자 :
SELECT tbl_id, ARRAY(SELECT json_array_elements_text(t.data->'tags')) AS txt_arr
FROM tbl t;
관련 :
미묘한 차이 : null
요소는 실제 배열 로 유지됩니다 . text
문자열을 생성하는 위의 쿼리에서는 불가능하며 null
값을 포함 할 수 없습니다 . 진정한 표현 배열이다.
함수 래퍼
반복적 인 사용을 위해 이것을 훨씬 더 간단하게하기 위해 함수에 논리를 캡슐화하십시오.
CREATE OR REPLACE FUNCTION json_arr2text_arr(_js json)
RETURNS text[] LANGUAGE sql IMMUTABLE AS
'SELECT ARRAY(SELECT json_array_elements_text(_js))';
더 큰 쿼리에서 인라인 될 수 있도록 SQL 함수로 만드십시오 . 더 큰 쿼리에서 반복적 인 평가를 피하고 인덱스 표현식에 허용하려면 (그렇기 때문에)
확인하십시오 .
IMMUTABLE
요구:
SELECT tbl_id, json_arr2text_arr(data->'tags')
FROM tbl;
db <> 바이올린 여기
Postgres 9.3 이상
기능을 사용하십시오 json_array_elements()
. 그러나 우리는 큰 따옴표로 묶인 문자열 을 얻 습니다.
외부 쿼리에서 집계가 포함 된 대체 쿼리 CROSS JOIN
누락되거나 비어있는 배열이있는 행을 제거합니다. 요소 처리에도 유용 할 수 있습니다. 집계하려면 고유 키가 필요합니다.
SELECT t.tbl_id, string_agg(d.elem::text, ', ') AS list
FROM tbl t
CROSS JOIN LATERAL json_array_elements(t.data->'tags') AS d(elem)
GROUP BY t.tbl_id;
따옴표로 묶인 문자열이있는 ARRAY 생성자 :
SELECT tbl_id, ARRAY(SELECT json_array_elements(t.data->'tags')) AS quoted_txt_arr
FROM tbl t;
그 주 null
위는 달리, 텍스트 값 "널 (null)"로 변환됩니다. 부정확하고 엄격하게 말하며 잠재적으로 모호 할 수 있습니다.
불쌍한 사람의 인용 부호 trim()
:
SELECT t.tbl_id, string_agg(trim(d.elem::text, '"'), ', ') AS list
FROM tbl t, json_array_elements(t.data->'tags') d(elem)
GROUP BY 1;
tbl에서 단일 행을 검색하십시오.
SELECT string_agg(trim(d.elem::text, '"'), ', ') AS list
FROM tbl t, json_array_elements(t.data->'tags') d(elem)
WHERE t.tbl_id = 1;
문자열은 상관 된 하위 쿼리를 형성합니다.
SELECT tbl_id, (SELECT string_agg(trim(value::text, '"'), ', ')
FROM json_array_elements(t.data->'tags')) AS list
FROM tbl t;
ARRAY 생성자 :
SELECT tbl_id, ARRAY(SELECT trim(value::text, '"')
FROM json_array_elements(t.data->'tags')) AS txt_arr
FROM tbl t;
원본 (오래된) SQL Fiddle .
db <> 바이올린 .
관련 :
참고 사항 (9 월 4 일 이후로 만료 됨)
JSON 배열에서 적절한 값 을 반환 json_array_elements_text(json)
하려면의 쌍이 필요합니다 . 그러나 그것은 제공되는 JSON 함수의 무기고 에서 누락 된 것 같습니다 . 또는 스칼라 값 에서 값 을 추출하는 다른 함수 입니다. 나도 그 누락 된 것 같습니다.
그래서 나는 즉흥적으로 했지만 사소하지 않은 경우에는 실패합니다 ...json_array_elements(json)
text
text
JSON
trim()
json_extract_path_text(your_column, 'tags')
당신이 찾고있는 무엇?