'PostgreSQL Can't Convert String to double precision

So I'm asked to do this query for a college project:

SELECT l.city AS name, AVG((pr.ap_price::double precision
                            * 7 - pr.weekly::double precision)
                           /((pr.ap_price::double precision))*100) AS savings_percentage 
FROM locations AS l, price AS pr, apartments AS ap, hosts AS h
WHERE pr.id_apt = ap.id_apartment AND l.id_apt = ap.id_apartment AND h.host_id = ap.id_host AND h.host_identity_verified = 't'
GROUP BY l.city
ORDER BY savings_percentage DESC LIMIT 3;

Where pr.ap_price and pr.ap_weekly are both saved as strings (VARCHAR(255)), and I've tried to cast them as other types wether using CAST(pr.ap_price AS double precision) or using the option found in the code above. It always ends up showing the same error wether I cast it to numeric or double precision: ERROR: la sintaxis de entrada no es válida para tipo double precision: «1,100.00» SQL state: 22P02 (In Spanish but basically says ERROR: the entrance syntaxis isn't valid for type double precision)

How can I cast it correctly? My objective is to turn it from string to numbers to be able to compare them.

I have also tried using: ALTER TABLE apartments_importacio ALTER COLUMN price TYPE double precision USING (price::double precision); but the same error shows. (Where apartments_importacio is the table where I copy the .csv file to later insert into the other tables)

Any clues? Thanks in advance!



Solution 1:[1]

I'm going to say it is because of this:

select ''::double precision;
ERROR:  invalid input syntax for type double precision: ""
LINE 1: select ''::double precision;

select '10'::double precision;
 float8 
--------
     10
(1 row)

The reason being an empty string is not a valid number.

One solution is to do:

select nullif(trim('  '), '')::double precision;
 nullif 
--------
   NULL
(1 row)

--- So for your case:

nullif(trim(pr.ap_price), '')::double precision

Otherwise you will need to go through an clean up the empty strings in those columns and change them to 0 or NULL. Long term I would say making those field float8 or better yet numeric is the better solution. Then you deal with the issue on creating the record.

UPDATE. Dealing with number formatting:

select '1,100.00'::double precision;
ERROR:  invalid input syntax for type double precision: "1,100.00"
LINE 1: select '1,100.00'::double precision;
               ^
select '1100.00'::double precision;
 float8 
--------
   1100
(1 row)

The solution to above is:

select to_number('1,100.00', '9999.99')::double precision;
 to_number 
-----------
      1100
(1 row)

For more information see

https://www.postgresql.org/docs/current/functions-formatting.html

to_number(text, text)   numeric     convert string to numeric   to_number('12,454.8-', '99G999D9S')```

See:

Table 9.27 shows the template patterns available for formatting numeric values.

For more information on your options for formatting.

Solution 2:[2]

hi you can tried with in case this number-text contein comma use ::

REPLACE(ap_price, ',', '.' )::double precision

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Gus Ch