It sounds like what you're essentially trying to do here is tease out the various different meanings of NULL and treat them systematically.
The problem is that there are not only a number of possible specific meanings of NULL in different contexts, but there also often remain ambiguous cases where it isn't possible to definitively categorise, or dual cases where the meaning depends on the processing being applied to the data (not on the intrinsic meaning of the data).
I use the example of a dog found injured on the street by a stranger and brought to a vet. From the vet's point of view, not only is the owner unknown, but whether the dog even has an owner is unknown (it could be a stray). If the dog has no owner, then the record of an owner is "inapplicable". If it has an owner who has not had chance to present themselves yet due to the circumstances, then the record is "missing". The problem is that these two cases are themselves ambiguous and unresolved - there is missing information about whether the owner information is missing or inapplicable. You then end up with a third "pending" case which could eventually collapse to one of the other two.
For records which withstand updates, there is also a possible distinction in some contexts between "missing-for-now" (action is being taken to seek the missing information) and "missing-permanently" (the missing condition is considered final).
You will often end up introducing a large amount of extra complexity to deal systematically with what are usually a spuriously small number of cases or relatively unimportant distinctions between unrecorded information.
If someone else has already determined a data model in which there are these distinctions and they make sense and are usable in context, then a solution to storing the different cases in SQL will often depend on desired performance and efficiency characteristics.
For example, simply storing a string value is the most flexible approach, since this can accommodate dates in string form plus any non-date special values. But if you need dates typed as dates when possible, you'll inevitably end up with at least a second field to hold an encoding of the special values which aren't part of SQL's date type.
null
, vs{}
vs{year: 2024}
vs{year:2024, month: 02}
and so on, up to maximum detail. Storing the model and retrieving it exactly the same is an implementation detail.{}
.NULL
is the only special value