如何在文本字段中将数字值显示或转换为数字

How to Display or Convert Number Values as Numbers In Text Field

我有一个 table,其列的数据类型为文本 (varchar)。该列主要包含数值,但偶尔包含文本值。当有文本值时,我需要按原样显示该值。但是,当有数值时,我需要将其转换为十进制值。

这是一个例子

因为第一行包含文本 "hrs",它应该按原样显示 12 小时。然而,第二行确实是一个数字,应该显示为 12.00。

当我使用如下所示的 "CASE" 语句时,出现 "CASE types character cannot be matched" 错误。

SELECT 
  [id], 
  [myvalue], 
  (CASE WHEN REGEXP_INSTR([value], '^[-+]?[0-9]*\.?[0-9]+$')=0 THEN [value] ELSE CAST([value] AS DECIMAL(12,2)) END) AS [newvalue],
FROM 
  [mytable]
;

我知道这是因为 "THEN" 和 "ELSE" 的输出数据类型需要匹配。

关于我如何做到这一点还有其他想法吗?

夫妇注意事项:

  1. 我知道 "newvalue" 列仍将被视为文本数据类型。
  2. 我并不是简单地尝试将结果四舍五入或添加“.00”。上面是一个简单的例子。数值不同,这确实需要转换为十进制。

因为您要在结果集中创建列,所以所创建的列必须具有单一类型。在您的情况下,您将某些值转换为 decimal,这意味着您的列必须包含两种类型(varchar 和 decimal)并且不会运行。

由于您的值中至少有一个是 varchar,因此它们必须都是(因为 varchar 不能总是转换为其他类型,例如 decimal 或 date 或 int 或其他类型)。

考虑:

user=# SELECT CAST('1' AS DECIMAL(12,2));
 numeric 
---------
    1.00
(1 row)

user=# SELECT CAST(CAST('1' AS DECIMAL(12,2)) AS VARCHAR(100));
 varchar 
---------
 1.00
(1 row)

所以这里我们将字符串文字 1 转换为小数。数据库按预期在该小数的表示中添加了两位小数。然后我们将那个东西转换回 varchar() 生成一个完整保留两位小数的字符串文字。

在你的 SQL 中使用它(由于我使用的是 postgres 而不是 redshift,所以修改了一点):

user=# WITH mytable AS (SELECT 'car' as value UNION SELECT '1') 
       SELECT (CASE WHEN REGEXP_REPLACE(value, '^[-+]?[0-9]*\.?[0-9]+$', '')=value 
           THEN value 
           ELSE CAST(CAST(value AS DECIMAL(12,2)) AS VARCHAR(100)) 
           END) AS newvalue 
       FROM mytable;
 newvalue 
----------
 1.00
 car
(2 rows)