2016-06-20 2 views
2

json_agg 함수가있는 PostgreSQL 요청에서 JSON 배열을 반환합니다. 그러나 행이 없으면 json_agg은 빈 JSON 배열 [] 대신 빈 문자열을 반환합니다 (json.org을 이해하면 대괄호는 필수 항목입니다). 예를 들어PostgreSQL json_agg() 함수가 빈 배열을 반환하지 않는 이유는 무엇입니까?

:과 같은 명령이 '1 = 1'(9.5 PostgreSQL의 테스트) 유효한 JSON 배열을 리턴 반면

SELECT json_agg(t.*) FROM (SELECT 'test' AS mycol WHERE 1 = 2) AS t ; 

는 빈 문자열을 반환한다.

아이디어가 있으십니까? 빈 세트에서 널 (null)

+0

'1 = 2' 모든 행과'1을 반환하지 않습니다 경우 = 1'은 모든 행을 반환합니다. 물론 결과는 다릅니다. 왜 당신은 그 놀라운 것을 정확히 발견합니까? –

+0

질문에서 설명했듯이, IMHO'json_agg'는 행을 선택하지 않으면 올바른 JSON 배열 (즉,'[] ')을 반환해야합니다. 대신에,'json_agg'는 빈 문자열을 반환합니다. – pdagog

+1

빈 문자열이 아닌'NULL'을 반환합니다. 그리고이 동작은 [문서화되어 있습니다] (https://www.postgresql.org/docs/current/static/functions-aggregate.html) : "* 카운트를 제외하고는이 함수는 행이 선택됩니다 * ". 원하지 않는다면,'coalesce()'를 사용하십시오. –

답변

5

json_agg 반환 :

select json_agg(t.*) is null 
from (select 'test' as mycol where 1 = 2) t ; 
?column? 
---------- 
t 

당신은 빈 JSON 배열을 원하는 경우 coalesce이 :

select coalesce(json_agg(t.*), '[]'::json) 
from (select 'test' as mycol where 1 = 2) t ; 
coalesce 
---------- 
[] 
+4

9.4에서 작동하지 않습니다. –

+0

9.6에서 잘 작동합니다. –

관련 문제