【问题标题】:PostgreSQL Can't Convert String to double precisionPostgreSQL 无法将字符串转换为双精度
【发布时间】:2020-07-15 18:27:42
【问题描述】:

所以我被要求为一个大学项目做这个查询:

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 (用西班牙语但基本上是说错误:入口语法对双精度类型无效

如何正确投射?我的目标是将其从字符串转换为数字以便能够比较它们。

我也尝试过使用: ALTER TABLE apartments_importacio ALTER COLUMN price TYPE double precision USING (price::double precision); 但显示相同的错误。 (其中 apartments_importacio 是我复制 .csv 文件以便稍后插入其他表的表)

有什么线索吗?提前致谢!

【问题讨论】:

标签: sql string postgresql casting double


【解决方案1】:

我要说是因为这个:

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.

【讨论】:

  • 在问题中,错误有«1,100.00»,这让我认为这可能是千位和小数点分隔符不同的语言环境差异。例如,一千美元十美分是 1 000,10 用于法语语言环境,1,000.10 用于英语,1.000,10 用于意大利语。
  • 问题是','。有关更多信息,请参阅我的更新。
  • 好的,知道了!我是使用 PostgreSQL 的新手,所以我需要一段时间才能发现 MySQL 和这个之间的细微差别。非常感谢!
猜你喜欢
  • 2015-04-24
  • 1970-01-01
  • 2020-10-20
  • 2020-12-14
  • 2020-07-17
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多