Hi all,

I'd like to report what I believe is an inconsistency in the behavior of the
jsonb - operator when applied to numeric arrays.

 

 

Problem

PostgreSQL allows us to check for the presence of a scalar inside a JSONB
array:

 

SELECT jsonb('[2,3,1]') @> to_jsonb(1);

-- Returns true

 

However, when attempting to remove that value from the array using -, the
operation fails:

SELECT jsonb('[2,3,1]') - to_jsonb(1);

-- ERROR: operator does not exist: jsonb - jsonb

-- HINT:  You might need to add explicit type casts.


This behavior differs from index-based removal:

SELECT jsonb('[2,3,1]') - 1;

-- Returns [2, 1]


But logically, if @> to_jsonb(1) is true, then jsonb('[2,3,1]') -
to_jsonb(1) should remove the value, not the index.

 

Proposal

Support a jsonb - jsonb operator where, if the RHS is a scalar that appears
in the LHS array, the operator removes all matching values:

SELECT jsonb('[2,3,1]') - to_jsonb(1);

-- Expected: [2, 3]

This would mirror similar behavior in many application languages and allow
value-based deletion from JSON arrays without casting back to SQL arrays or
using procedural workarounds.


Impact

The absence of this capability creates a gap in value-level JSONB
manipulation. Developers often have to resort to:

*       Procedural code in PL/pgSQL
*       Transforming JSONB arrays into SQL arrays (with limited type
support)
*       Writing client-side logic

Adding support for this behavior would simplify many API use cases involving
JSON state manipulation.

  _____  

Happy to clarify further or contribute a patch.

Best regards,
Mark Drake

 

Reply via email to