Re: Wrapping a where clause to preserve rows with nulls - Mailing list pgsql-general

From Adrian Garcia Badaracco
Subject Re: Wrapping a where clause to preserve rows with nulls
Date
Msg-id CAE8z92FZa5dmnm3k2OQOVsazbuUrdSh8HFrgkU3XM79cxv66tw@mail.gmail.com
Whole thread Raw
In response to Wrapping a where clause to preserve rows with nulls  (Adrian Garcia Badaracco <adrian@adriangb.com>)
List pgsql-general
I'll note that the clause is arbitrary in the sense that I don't generate it and cannot edit it but it's basically a bunch of boolean comparisons chained i.e. `col_a >= 1 and col_b <=5 and col_c ...` so I can in general add an index on say col_a and it does get used.

On Wed, Dec 18, 2024 at 9:47 PM Adrian Garcia Badaracco <adrian@adriangb.com> wrote:
I have a query where I have to run a where clause generated by another system (i.e., I can't modify that where clause. The where clause may return `null`,  but I actually want to keep rows that return `null` (and rows that return `true` but not rows that return `false`).

I thought it would be as simple as wrapping in `(...) is not false` but that seems to prevent index usage.

For example, let's say that given the table:

CREATE TABLE test_index (value INTEGER);
CREATE INDEX idx_value ON test_index(value);

And the predicate `value = 5000`, if I run the original query that excludes rows where the predicate is null it uses the index:

SELECT *
FROM test_index
WHERE value = 5000;

But as soon as I tack on an `IS NOT FALSE` the index is not used:

SELECT *
FROM test_index
WHERE (value = 5000) IS NOT FALSE;

This was surprising to me. I was hoping this might be able to use the index.

Is there any way to include the rows where the predicate evaluates to null while still using an index?

pgsql-general by date:

Previous
From: Adrian Garcia Badaracco
Date:
Subject: Wrapping a where clause to preserve rows with nulls
Next
From: "David G. Johnston"
Date:
Subject: Re: Wrapping a where clause to preserve rows with nulls