SQL Server:将varchar转换为带有符号的数字

时间:2016-04-15 07:39:38

标签: sql sql-server sql-server-2012

我有一个像这样的varchar值:

DECLARE @TestConvert VARCHAR(MAX) = '1234.94-'

我想将此值转换为decimal(5,2)喜欢这个:

SELECT CAST(@TestConvert AS DECIMAL(18, 4))

问题是值结尾处的符号。

如果标志位于开头,则为:

DECLARE @TestConvert VARCHAR(MAX) = '1234.94-'

我没问题。这有什么解决方案或解决方法吗?

感谢。

4 个答案:

答案 0 :(得分:3)

对于SQL2012及以上版本<li *ngFor="#item of clients"> {{client.name}} </li> 将处理此问题。 (我的测试框正在运行2016,所以如果这对您不起作用,请道歉)

PARSE

DECLARE @TestConvert VARCHAR(MAX) = '1234.94-' SELECT PARSE(@TestConvert AS DECIMAL(18, 4)) AS Converted Converted --------------------------------------- -1234.9400 (1 row(s) affected) 文档https://msdn.microsoft.com/en-us/library/hh213316(v=sql.110).aspx

和相关的

PARSE https://msdn.microsoft.com/en-us/library/hh213126(v=sql.110).aspx

答案 1 :(得分:1)

试试这个:

  DECLARE @TestConvert VARCHAR(MAX) = '1234.94-' 
  SELECT CAST((RIGHT(@TestConvert,1)+LEFT(@TestConvert,LEN(@TestConvert)-1)) as DECIMAL(18,4))

这个答案假设&#39; - &#39;符号总是在最后

如果有时将值格式化为-1234.94,则可以执行以下操作:

 DECLARE @TestConvert VARCHAR(MAX) = '1234.94-' 
 SELECT
 CASE WHEN ISNUMERIC(@TestConvert)=1  THEN 
 CAST(@TestConvert AS Decimal(18,4) )
 ELSE
CAST((RIGHT(@TestConvert,1)+LEFT(@TestConvert,LEN(@TestConvert)-1)) as DECIMAL(18,4))
END

答案 2 :(得分:1)

DECLARE @TestConvert VARCHAR(MAX) = '1234.94-'

if(charindex('-', @TestConvert) = len(@TestConvert))
begin
    set @TestConvert = replace(@TestConvert, '-', '')
    select 0 - cast(@TestConvert as DECIMAL(6, 2))
end
else
    select cast(@TestConvert as DECIMAL(6, 2))

答案 3 :(得分:1)

你可以尝试

declare @val as nvarchar(max)='5656.99-'

select case when CHARINDEX('+',reverse(@val))=1 or CHARINDEX('-',reverse(@val))=1 then
CAST(REVERSE(STUFF(REVERSE(@val),1,1,'')) as decimal(18,2)) else cast(@val as decimal(18,2)) end

希望它能为任何案件转换价值。