The following forces all NULLs to be included and makes it clear to the user of the report that the value is missing:

```
SELECT ISNULL([ColumnNameHere],'[ None ]') AS [ColumnNameHere]
WHERE ISNULL([ColumnNameHere],'[ None ]') IN (@MultiParam)
```

**TL;DR:**

The operations are well defined according to the draft C++ standard.

**Details**

We can see that by going to the draft C++ standard section `5.9`

*Relational operators* which says (*emphasis mine going forward*):

The **operands shall have arithmetic**, enumeration, or pointer **type**, or type std::nullptr_t. The operators
< (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) all yield
false or true. The type of the result is bool

and bools are arithematic types from 3.9.1 Fundamental types

Types **bool**, char, char16_t, char32_t, wchar_t, and the signed and unsigned integer types are collectively
**called integral types.**

and

Integral and floating types are collectively called arithmetic
types.

and `true`

and `false`

are boolean literals from `2.14.6`

Boolean literals:

```
boolean-literal:
false
true
```

Going back to section `5.9`

to see the mechanics of the relational operators further, it says:

The usual arithmetic conversions are performed on operands of arithmetic or enumeration type.

the *usual arithmetic conversions* are covered in section `5`

which says:

Otherwise, the integral promotions (4.5) shall be performed on both operands

and section `4.5`

says:

A prvalue of type bool can be converted to a prvalue of type int, with false becoming zero and true
becoming one.

and so the expressions:

```
false < false
false < true
true < false
true < true
```

using these rules become:

```
0 < 0
0 < 1
1 < 0
1 < 1
```

## Best Solution

Set the dataset filter to something like this:

I have 3 available values for

`@parmTRUEFALSE`

If the user selects All Records... the filter uses

`ObjectFieldName.Value`

and returns all records because`@parmTRUEFALSE = (Null) / IsNothing`