PostgreSQL 无法将字符串转换为双精度
PostgreSQL Can't Convert String to double precision
所以我被要求为一个大学项目做这个查询:
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;
其中 pr.ap_price 和 pr.ap_weekly 都保存为字符串 (VARCHAR(255)),我尝试将它们转换为其他类型,无论是使用 CAST(pr.ap_price AS double precision)
还是使用上面代码中的选项。
无论我将其转换为数字精度还是双精度,它总是最终显示相同的错误:
ERROR: la sintaxis de entrada no es válida para tipo double precision: «1,100.00» SQL state: 22P02
(在西班牙语中,但基本上说 错误:入口语法对双精度类型无效)
如何正确投射?我的 objective 是将它从字符串转换为数字以便能够比较它们。
我也尝试过使用:
ALTER TABLE apartments_importacio ALTER COLUMN price TYPE double precision USING (price::double precision);
但显示相同的错误。 (其中 apartments_importacio 是我复制 .csv 文件以便稍后插入到其他 table 的 table)
有什么线索吗?提前致谢!
我要说是因为这个:
select ''::double precision;
ERROR: invalid input syntax for type double precision: ""
LINE 1: select ''::double precision;
select '10'::double precision;
float8
--------
10
(1 row)
空字符串不是有效数字的原因。
一个解决方案是:
select nullif(trim(' '), '')::double precision;
nullif
--------
NULL
(1 row)
--- So for your case:
nullif(trim(pr.ap_price), '')::double precision
否则您将需要清理这些列中的空字符串并将它们更改为 0 或 NULL。从长远来看,我会说将这些字段设置为 float8 或更好但数字是更好的解决方案。然后你处理创建记录的问题。
更新。处理数字格式:
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)
上面的解决方法是:
select to_number('1,100.00', '9999.99')::double precision;
to_number
-----------
1100
(1 row)
有关详细信息,请参阅
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.
您好,如果这个 number-text 包含逗号,您可以使用 ::
进行交易
REPLACE(ap_price, ',', '.' ::双精度
所以我被要求为一个大学项目做这个查询:
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;
其中 pr.ap_price 和 pr.ap_weekly 都保存为字符串 (VARCHAR(255)),我尝试将它们转换为其他类型,无论是使用 CAST(pr.ap_price AS double precision)
还是使用上面代码中的选项。
无论我将其转换为数字精度还是双精度,它总是最终显示相同的错误:
ERROR: la sintaxis de entrada no es válida para tipo double precision: «1,100.00» SQL state: 22P02
(在西班牙语中,但基本上说 错误:入口语法对双精度类型无效)
如何正确投射?我的 objective 是将它从字符串转换为数字以便能够比较它们。
我也尝试过使用:
ALTER TABLE apartments_importacio ALTER COLUMN price TYPE double precision USING (price::double precision);
但显示相同的错误。 (其中 apartments_importacio 是我复制 .csv 文件以便稍后插入到其他 table 的 table)
有什么线索吗?提前致谢!
我要说是因为这个:
select ''::double precision;
ERROR: invalid input syntax for type double precision: ""
LINE 1: select ''::double precision;
select '10'::double precision;
float8
--------
10
(1 row)
空字符串不是有效数字的原因。
一个解决方案是:
select nullif(trim(' '), '')::double precision;
nullif
--------
NULL
(1 row)
--- So for your case:
nullif(trim(pr.ap_price), '')::double precision
否则您将需要清理这些列中的空字符串并将它们更改为 0 或 NULL。从长远来看,我会说将这些字段设置为 float8 或更好但数字是更好的解决方案。然后你处理创建记录的问题。
更新。处理数字格式:
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)
上面的解决方法是:
select to_number('1,100.00', '9999.99')::double precision;
to_number
-----------
1100
(1 row)
有关详细信息,请参阅
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.
您好,如果这个 number-text 包含逗号,您可以使用 ::
进行交易REPLACE(ap_price, ',', '.' ::双精度