Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在文本字段中将数字值显示或转换为数字_Sql_Amazon Redshift_Case When - Fatal编程技术网

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

Sql 如何在文本字段中将数字值显示或转换为数字,sql,amazon-redshift,case-when,Sql,Amazon Redshift,Case When,我有一个表,其中的列具有text(varchar)数据类型。该列主要包含数值,但偶尔包含文本值。当有文本值时,我需要按原样显示该值。但是,当有数值时,我需要将其转换为十进制值 这里有一个例子 因为第一行包含文本“hrs”,所以它应该按原样显示并显示12小时。但是,第二行实际上是一个数字,应该显示为12.00 当我使用如下所示的“CASE”语句时,我得到了“CASE-types字符不能匹配”错误 我知道这是因为“THEN”和“ELSE”的输出数据类型需要匹配 关于我如何做到这一点,还有其他想法吗

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

这里有一个例子

因为第一行包含文本“hrs”,所以它应该按原样显示并显示12小时。但是,第二行实际上是一个数字,应该显示为12.00

当我使用如下所示的“CASE”语句时,我得到了“CASE-types字符不能匹配”错误

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

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

注意事项:

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

  • 因为要在结果集中创建列,所以创建的列必须具有单一类型。在您的例子中,您正在将某些值强制转换为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)
    
    因此,这里我们将字符串literal
    1
    转换为十进制。数据库按预期在该小数的表示形式中添加两位小数。然后,我们将该内容转换回一个
    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)