Sql 如何在文本字段中将数字值显示或转换为数字
我有一个表,其中的列具有text(varchar)数据类型。该列主要包含数值,但偶尔包含文本值。当有文本值时,我需要按原样显示该值。但是,当有数值时,我需要将其转换为十进制值 这里有一个例子 因为第一行包含文本“hrs”,所以它应该按原样显示并显示12小时。但是,第二行实际上是一个数字,应该显示为12.00 当我使用如下所示的“CASE”语句时,我得到了“CASE-types字符不能匹配”错误 我知道这是因为“THEN”和“ELSE”的输出数据类型需要匹配 关于我如何做到这一点,还有其他想法吗 注意事项:Sql 如何在文本字段中将数字值显示或转换为数字,sql,amazon-redshift,case-when,Sql,Amazon Redshift,Case When,我有一个表,其中的列具有text(varchar)数据类型。该列主要包含数值,但偶尔包含文本值。当有文本值时,我需要按原样显示该值。但是,当有数值时,我需要将其转换为十进制值 这里有一个例子 因为第一行包含文本“hrs”,所以它应该按原样显示并显示12小时。但是,第二行实际上是一个数字,应该显示为12.00 当我使用如下所示的“CASE”语句时,我得到了“CASE-types字符不能匹配”错误 我知道这是因为“THEN”和“ELSE”的输出数据类型需要匹配 关于我如何做到这一点,还有其他想法吗
因为要在结果集中创建列,所以创建的列必须具有单一类型。在您的例子中,您正在将某些值强制转换为decimal,这意味着您的列将必须包含两种类型(varchar和decimal),而这不会发生变化 因为至少有一个值是varchar,所以它们都必须是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)
因此,这里我们将字符串literal1
转换为十进制。数据库按预期在该小数的表示形式中添加两位小数。然后,我们将该内容转换回一个varchar()
,生成一个保留两位小数的字符串文本
在您的SQL中使用此选项(由于我使用postgres,而不是redshift,所以修改了touch):
将其转换回
varchar()
以便类型匹配,例如Cast(Cast([value]AS DECIMAL(12,2))AS varchar(100))
同一列中不能有两种不同的类型,因为其中一个值必须是varchar,那么它们必须都是。什么是“将其转换为十进制”呢?列只有一种类型,即字符串或数字。不是两个都有,当然有。我指的是它的展示方式。正如我在最后的笔记#1中指出的,我知道专栏最终将是文本。我想将真实数值的显示更改为十进制格式(理解它仍然是文本),@Jnevill方法对您不起作用吗?因为我也会这么做的。谢谢大家。你的建议行得通
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)
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)