It turns out that 'NaN' is a simbolic value meaning "Not a number".
In addition to ordinary numeric values, the numeric type allows the special value NaN, meaning "not-a-number". Any operation on NaN yields another NaN. When writing this value as a constant in an SQL command, you must put quotes around it, for example UPDATE table SET x = 'NaN'. On input, the string NaN is recognized in a case-insensitive manner.
Note: In most implementations of the "not-a-number" concept, NaN is not considered equal to any other numeric value (including NaN). In order to allow numeric values to be sorted and used in tree-based indexes, PostgreSQL treats NaN values as equal, and greater than all non-NaN values.
In addition to ordinary numeric values, the floating-point types have several special values:
If you want to compare against the 'NaN' ("not a number") float value, then do an explicit cast to float: float('NaN').
Here are some very good insights regarding this topic.
This issue arose due to the apparent fact that the function crosstab returns this symbolic constant.
In the end she did this:
CASE WHEN CHALCO = 'NaN'::float OR CHALCO IS NULL THEN 0 ELSE CHALCO END,and seemed to work.