persons
두 개의 열과 id
JSONB 기반 data
열 을 포함 하는 테이블 이 있습니다 (이 테이블은 PostgreSQL의 JSON 지원으로 데모하기 위해 만들어졌습니다).
이제 두 개의 레코드가 있다고 가정합니다.
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
이제 25 세 이상인 모든 사람의 이름을 얻고 싶습니다.
select data->'name' as name from persons where data->'age' > 25
불행히도 이로 인해 오류가 발생합니다. ->>
대신을 사용하여 해결할 수 ->
있지만 숫자가 비교되지 않고 문자열로 표현되기 때문에 비교가 더 이상 예상대로 작동하지 않습니다.
select data->'name' as name from persons where data->>'age' > '25'
그런 다음을 사용하여 실제로 문제를 해결할 수 있다는 것을 알았 ->
습니다 int
.
select data->'name' as name from persons where cast(data->'age' as int) > 25
이것은 작동하지만 실제 유형을 알아야한다는 것은 좋지 않습니다 ( age
JSON 문서 의 유형 은 number
어쨌든 PostgreSQL이 스스로 알아낼 수없는 이유는 무엇입니까?).
그런 다음 구문 을 text
사용하여 수동으로 변환하면 ::
모든 것이 예상대로 작동 한다는 것을 알았 습니다. 이제 문자열을 다시 비교하고 있습니다.
select data->'name' as name from persons where data->'age'::text > '25'
그런 다음 나이 대신 이름으로 시도하면 작동하지 않습니다.
select data->'name' as name from persons where data->'name'::text > 'Jenny'
오류가 발생합니다.
json 유형의 유효하지 않은 입력 구문
분명히, 나는 여기에 무언가를 얻지 못한다. 불행히도 PostgreSQL에서 JSON을 사용하는 실제 사례를 찾기는 매우 어렵습니다.
힌트가 있습니까?
'Jenny'
했다 '"Jenny"'
.
data->'name'::text
, 당신은 캐스팅'name'
텍스트 문자열이 아닌 결과를. 유효한 JSON 리터럴'25'
이므로 비교할 때 오류가 발생하지 않습니다25
. 그러나Jenny
( 그렇지 는 않지만 ) 아닙니다"Jenny"
.