-- Normal value
INSERT INTO _test_numeric (rating, rating_state)
VALUES (1.2345, 'OK');
-- NaN
INSERT INTO _test_numeric (rating, rating_state)
VALUES (NULL, 'NAN');
-- Missing / unknown
INSERT INTO _test_numeric (rating, rating_state)
VALUES (NULL, 'MISSING');
-- Future-proof: Infinity (if you ever normalize upstream)
INSERT INTO _test_numeric (rating, rating_state)
VALUES (NULL, 'INF');
-- Only valid numeric values
SELECT *
FROM _test_numeric
WHERE rating_state = 'OK';
-- All special values (NaN, INF, etc.)
SELECT *
FROM _test_numeric
WHERE rating_state <> 'OK';
-- Count by state
SELECT rating_state, count(*)
FROM _test_numeric
GROUP BY rating_state
ORDER BY rating_state;
-- Safe aggregation
SELECT avg(rating)
FROM _test_numeric
WHERE rating_state = 'OK';
-- Human-readable output
SELECT
id,
CASE
WHEN rating_state = 'OK' THEN rating::text
ELSE rating_state
END AS rating_display
FROM _test_numeric;