如何转换文本36 1/2至36.5 PostgreSQL中

问题描述:

我有一个具有值36 1/2它被存储为字符varying.from PostgreSQL的功能,我需要这个文本转换为36.5,以匹配实际的列值。如何在postgresql中将文本'36 1/2'转换为36.5?如何转换文本36 1/2至36.5 PostgreSQL中

+0

是'1/2'唯一小数分量出现,而'36 1/2'是最复杂的用例吗?顺便说一句,处理这个问题的最好方法是修复你的数据源,因此你不需要在Postgres中做任何复杂的按摩。 –

WITH f(n) AS 
    (SELECT * 
    FROM regexp_matches('36 1/2', '^([\d.]+)(+(\d+)/(\d+))*$')) 
SELECT CASE 
      WHEN n[2] IS NULL 
      THEN n[1]::float8 
      ELSE n[1]::float8 + n[3]::float8/n[4]::float8 
     END 
FROM f; 
+0

它正在为36 1/2,但它不能为36 0或36 –

+0

没有人会写“36 0”,肯定?这是无稽之谈。而且很容易使小数部分匹配条件... –

+0

@ShamseerPC你没有问''36''转换,但无论如何,我已经更新了解决方案。 –