Primero y principal: estoy de acuerdo con los comentarios de @a_horse_with_no_name y @dezso: debe normalizar sus datos . JSON no es para eso.
Sin embargo, si alguna razón por la que no puedo entender realmente hace de esto una ventaja, es posible:
Crear una expresión basadaUNIQUE INDEX
:
CREATE UNIQUE INDEX people_data_pos_idx ON peoples( (data->>'pos') ) ;
Si, en este punto, intenta insertar el siguiente dato en su tabla (con una ya existente - >> pos):
INSERT INTO peoples(data)
VALUES
('{"name": "Eve", "pos":"DBA", "age":34}') ;
Obtienes esto como respuesta:
ERROR: duplicate key value violates unique constraint "people_data_pos_idx"
SQL state: 23505
Detail: Key ((data ->> 'pos'::text))=(DBA) already exists.
NOTA: Supuse que data.pos
siempre será una cadena. Si desea generalizar, puede usar ( (data->'pos') )
en su lugar. Luego indexaría una expresión JSON (B) en lugar de un texto. Verifique las funciones y operadores de JSON .