I have some legacy data with a binary column, fish_otolith, that is not accurate. It should indicate based on separate column named fish_age. When an age is present in the fish_age column the binary column, fish_otolith, should indicate and when a null value is present in the fish_age column the binary column, fish_otolith, should not indicate.
fish_otolith | fish_age |
---|---|
1 | 10 |
1 | 2 |
0 | Null |
1 | Null |
1 | Null |
I am struggling with writing the correct update sql statement of "if fish_age is not Null then fish_otolith is equal to 1, else if fish is null then fish_otolith is equal to 0
CodePudding user response:
If your fish_otolith
is a boolean, then try this:
update ttable
set fish_otolith = fish_age is not null;
CodePudding user response:
The expression fish_age is not null
returns a boolean value which can be cast as an integer with the result false -> 0
and true -> 1
, which is the results you are looking for. So:
update fishes
set fish_otolith = (fish_age is not null)::integer;
This (or any other update) however contains a potential fatal flaw: fish_otolith
can be updated independent of fish_age
and can contain any valid integer not just 0 or 1. This con be overcome with a slight design change. Define fish_otolith
as a generated always ...
derived from fish_age
. (see demo here - for both implementations).
Note: Either setting by @MikeOrganek would also work.