在mssql中选择case语句错误

Sar*_*sam 0 sql sql-server sql-server-2008

SELECT top 1 
    case 
        when VR = -99999.99 
        then 0 
        else cast((VR*1.732) as decimal(38,3)) 
    end 
FROM pseb.dbo.datasource 
where FeederID=5003
order by datetime desc
Run Code Online (Sandbox Code Playgroud)

上面的查询工作正常,但我需要返回varchar值' - '而不是返回0

如果我喜欢那样的话

SELECT top 1 
    case 
        when VR = -99999.99 
        then '--' 
        else cast((VR*1.732) as decimal(38,3)) 
    end 
FROM pseb.dbo.datasource 
where FeederID=5003
order by datetime desc
Run Code Online (Sandbox Code Playgroud)

表示它返回以下错误:

消息8114,级别16,状态5,行1错误将数据类型varchar转换为数字.

请帮我解决一下

Joh*_*ski 5

问题是您从同一列返回两种不同的数据类型.SQL Server的规则,数字类型优先于字符串类型,即在像你这样的情况下,字符串被转换为数字,而不是相反.

因此,要解决此问题,您可以将数字转换为字符串.

一种选择是做这样的事情:

SELECT top 1 
   case when VR = -99999.99 then '--' 
    else 
     cast
      ( 
        cast((VR*1.732) as decimal(38,3)
      ) 
     as varchar(50)) 
    end 
  FROM pseb.dbo.datasource where FeederID=5003 order by datetime desc
Run Code Online (Sandbox Code Playgroud)