빈 개체에 대해 json 열을 쿼리하는 방법
특정 json 열에 빈 객체가 포함된 모든 행을 찾고 있습니다.{}이것은 JSON 어레이 또는 객체에서 특정 키를 찾고 있는 경우에 가능합니다.하지만 나는 단지 그 물체가 비어있는지 알고 싶다.이 작업을 수행할 운영자를 찾을 수 없습니다.
dev=# \d test
Table "public.test"
Column | Type | Modifiers
--------+------+-----------
foo | json |
dev=# select * from test;
foo
---------
{"a":1}
{"b":1}
{}
(3 rows)
dev=# select * from test where foo != '{}';
ERROR: operator does not exist: json <> unknown
LINE 1: select * from test where foo != '{}';
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
dev=# select * from test where foo != to_json('{}'::text);
ERROR: operator does not exist: json <> json
LINE 1: select * from test where foo != to_json('{}'::text);
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
dwv=# select * from test where foo != '{}'::json;
ERROR: operator does not exist: json <> json
LINE 1: select * from test where foo != '{}'::json;
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
평등을 확립하기 어렵기 때문에 데이터 유형 전체에 대해 동등(또는 불평등) 연산자가 없습니다.가능한 경우 Postgres 9.4 이후를 고려하십시오.자세한 내용은 dba 관련 답변을 참조하십시오.SE(마지막 장):
SELECT DISTINCT json_column ...또는... GROUP BY json_column같은 이유로 실패한다(동등 연산자 없음).
표현의 양면성을 표현하다text허용한다=또는<>연산자는 동일 JSON 값에 대해 여러 가지 가능한 텍스트 표현이 있기 때문에 일반적으로 신뢰할 수 없습니다.Postgres 9.4 이후에서는 다음 주소로 캐스팅jsonb대신 (또는 사용)jsonb우선은) 입니다.
다만, 이 특정의 경우(빈 오브젝트)에서는, 정상적으로 동작합니다.
select * from test where foo::text <> '{}'::text;
빈 JSON 배열[]관련이 있을 수도 있습니다.
그럼 이건 두 사람 모두에게 효과가 있을 거야[]그리고.{}:
select * from test where length(foo::text) > 2 ;
Postgre 기준SQL 9.5 JSON 데이터를 사용하여 이러한 유형의 쿼리를 수행할 수 없습니다.한편, 매우 유용하게 사용할 수 있도록 요청을 작성했습니다.
https://postgresql.uservoice.com/forums/21853-general/suggestions/12305481-check-if-json-is-empty
자유롭게 투표해 주세요.실행되기를 바랍니다!
조심해야 돼요.비교할 수 있도록 모든 데이터를 다른 유형으로 캐스팅하면 대규모 데이터베이스에서 성능 문제가 발생합니다.
데이터에 일관된 키가 있는 경우 키의 존재를 확인할 수 있습니다.예를 들어 계획 데이터가 {} 또는 {id: '1'}인 경우
그러면 'id'가 없는 항목을 찾을 수 있습니다.
SELECT * FROM public."user"
where NOT(plan ? 'id')
9.3에서는 각 객체의 쌍을 카운트하고 없음으로 필터링할 수 있습니다.
create table test (foo json);
insert into test (foo) values
('{"a":1, "c":2}'), ('{"b":1}'), ('{}');
select *
from test
where (select count(*) from json_each(foo) s) = 0;
foo
-----
{}
또는 존재를 테스트합니다.큰 물체의 경우 아마도 더 빠를 것입니다.
select *
from test
where not exists (select 1 from json_each(foo) s);
이 두 가지 기술은 어떤 형태로든 완벽하게 동작합니다.
JSON Functions and Operators(JSON 함수 및 연산자) 설명서에 따르면 이중 화살표 기능을 사용할 수 있습니다(->>json 객체 또는 배열 필드를 텍스트로 가져옵니다.그런 다음 문자열에 대해 동등성 검사를 수행합니다.
그래서 이게 통했어.
SELECT jsonb_col from my_table
WHERE jsonb_col ->> 'key' = '{}';
또는 여러 되어 있는 경로 함수 함수)를합니다.#>>)
SELECT jsonb_col from my_table
WHERE jsonb_col #>> '{key, nestedKey}' = '{}';
현재 지원되는 버전:
지원되는 버전: 현재 (13) / 12 / 11 / 10 / 9.6
언급URL : https://stackoverflow.com/questions/24292575/how-to-query-a-json-column-for-empty-objects
'programing' 카테고리의 다른 글
| jq를 사용하여 배열의 모든 값 가져오기 (0) | 2023.03.16 |
|---|---|
| JSON.net을 사용한JToken 이름/키 취득 (0) | 2023.03.16 |
| SQL 쿼리에서 콜론 기호 ":"의 역할은 무엇입니까? (0) | 2023.03.16 |
| Ionic Framework를 사용한 로그인/로그아웃 이력 클리어 및 새로고침 페이지 (0) | 2023.03.16 |
| Angular 2 확인란 양방향 데이터 바인딩 (0) | 2023.03.16 |