I have two tables, posts
and stars
. When the rank
(a post column, integer type
) of a post entry (row) is changed, I want to update the priority
(a post column, double precision type) value. The priority
calculation needs to take into account a subquery from another table called stars
(for star_count
and total_stars
as floats) which is dependent on whether an action
(a stars
column, boolean type
) exists.
I thought that the problem might be related to the NULLIF statement
in my COALESCE
section improperly checking if the subquery exists (is null
), but am not sure how else I could solve this.
UPDATE posts
SET priority = (
COALESCE(
NULLIF (subquery.star_count/CAST(subquery.total_stars AS FLOAT), ''),
0.0
) + posts.rank)
FROM (
SELECT sum(CASE action WHEN true THEN 1 ELSE 0 END) AS star_count, count(*) AS total_stars
FROM stars
WHERE post_id = $1
) AS subquery
WHERE posts.id = $1
Expectation:
- if "action" exists (as either 1 OR 0), then calculate
priority
= (star_count
/total_stars
) +posts.rank
- else if "action" doesn't exist, calculate
priority
=0.0
+posts.rank
Unfortunately, anytime I trigger a change of the rank
value of a posts entry with no existing "action", I receive the error:
ERROR 22P02 (invalid_text_representation) invalid input syntax for type double precision: ""
Should I instead be trying something with CASE
and EXISTS
?
Any suggestions would be greatly appreciated.
Edit: after trying @Erwin Brandstetter's solution, the calculation of priority doesn't yield the expected result.
When testing the scenario where action
does not exist yet (intentionally):
Attempt | Rank | Priority (actual) | Priority (expected) | Action
1 | 0 | null | 0 | null
2 | 1 | 0 | 1 | null
3 | 0 | 1 | 0 | null
4 | 1 | 0 | 1 | null
5 | 2 | 1 | 2 | null
6 | 3 | 2 | 3 | null
7 | 4 | 3 | 4 | null
8 | 5 | 4 | 5 | null
9 | 1 | 5 | 1 | null
10 | 2 | 1 | 2 | null
11 | 4 | 2 | 4 | null
Priority does seem to get calculated after each update, but why does it not follow the else statement correctly?