postgresql无法将字符串转换为双精度

ki0zmccv  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(831)

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

  1. SELECT l.city AS name, AVG((pr.ap_price::double precision
  2. * 7 - pr.weekly::double precision)
  3. /((pr.ap_price::double precision))*100) AS savings_percentage
  4. FROM locations AS l, price AS pr, apartments AS ap, hosts AS h
  5. 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'
  6. GROUP BY l.city
  7. ORDER BY savings_percentage DESC LIMIT 3;

其中pr.ap\u price和pr.ap\u 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 (在西班牙语中,但基本上说是错误的:入口syntaxis对于类型double precision无效)
我怎样才能正确地投下它?我的目标是把它从字符串变成数字,以便能够比较它们。
我也尝试过使用: ALTER TABLE apartments_importacio ALTER COLUMN price TYPE double precision USING (price::double precision); 但同样的错误也出现了(其中,importacio是我复制.csv文件以稍后插入其他表的表)
有什么线索吗?提前谢谢!

cx6n0qe3

cx6n0qe31#

我要说是因为这个:

  1. select ''::double precision;
  2. ERROR: invalid input syntax for type double precision: ""
  3. LINE 1: select ''::double precision;
  4. select '10'::double precision;
  5. float8
  6. --------
  7. 10
  8. (1 row)

空字符串的原因不是有效的数字。
一种解决方案是:

  1. select nullif(trim(' '), '')::double precision;
  2. nullif
  3. --------
  4. NULL
  5. (1 row)
  6. --- So for your case:
  7. nullif(trim(pr.ap_price), '')::double precision

否则,您将需要通过一个清除这些列中的空字符串并将它们更改为0或null的过程。从长远来看,我会说让这些字段浮动8或更好的数字是更好的解决方案。然后处理创建记录的问题。
更新。处理数字格式:

  1. select '1,100.00'::double precision;
  2. ERROR: invalid input syntax for type double precision: "1,100.00"
  3. LINE 1: select '1,100.00'::double precision;
  4. ^
  5. select '1100.00'::double precision;
  6. float8
  7. --------
  8. 1100
  9. (1 row)

解决上述问题的方法是:

  1. select to_number('1,100.00', '9999.99')::double precision;
  2. to_number
  3. -----------
  4. 1100
  5. (1 row)

有关更多信息,请参阅
https://www.postgresql.org/docs/current/functions-formatting.html

  1. to_number(text, text) numeric convert string to numeric to_number('12,454.8-', '99G999D9S')```
  2. See:
  3. Table 9.27 shows the template patterns available for formatting numeric values.
  4. For more information on your options for formatting.
展开查看全部

相关问题