计算nVarchar的值

时间:2018-01-10 07:20:53

标签: sql sql-server sql-server-2014

我有一个名为table的{​​{1}},因为有一个transactionscolumn数据类型ratenvarcharcolumn的值类似于rate

我正在寻找一个查询,如果我运行该查询,我应该得到答案1/2250

如下所示

0.0004

我正在寻找的输出是Select cast(rate as int) as rate from transactions ,但现在我得到0.0004

感谢。

4 个答案:

答案 0 :(得分:1)

试试这个

create table #tmpTable (rate varchar(10))
insert into #tmpTable values
('1'),('1/2250'),('1.04'),('1/4')

select case CHARINDEX('/', rate)
       when 0 then cast(rate as real) --if there's no division sign, then take number as it is
       else cast(SUBSTRING(rate, 1, CHARINDEX('/', rate) - 1) as real) / 
            cast(SUBSTRING(rate, CHARINDEX('/', rate) + 1,LEN(rate)) as real)
       end
from #tmpTable

答案 1 :(得分:0)

您获得了Erro,因为您的列中存在非数字值。此外,由于您希望结果包含小数部分,因此转换为INT将不适合您。

试试这个

Select 
cast(rate as DECIMAL(10,4)) as rate 
from transactions WHERE ISNUMERIC(rate )=1

    Select 
cast(
    (CASE WHEN ISNUMERIC(rate )=1 
            THEN rate 
        ELSE 0 END
    ) as DECIMAL(10,4)) as rate 
from transactions

答案 2 :(得分:0)

你走的路是错的,但你应该做一些动态的方法

undefined

编辑您还可以尝试使用某种功能方法,并假设您有其他费率格式,如declare @data nvarchar(25) = '1/2250', @q varchar(50) set @q = 'select '+@data+'' exec (@q)

1/2250

答案 3 :(得分:0)

试试这个:

DECLARE @transaction TABLE(rate NVARCHAR(100));
INSERT INTO @transaction VALUES('1/5'),('1/2250'),('7/16');

SELECT t.rate
      ,CAST(A.Casted.value('/x[1]','decimal(10,4)') / A.Casted.value('/x[2]','decimal(10,4)') AS DECIMAL(10,4)) AS ComputedRate
FROM @transaction AS t
CROSS APPLY(SELECT CAST('<x>' + REPLACE(t.rate,'/','</x><x>') + '</x>' AS XML)) AS A(Casted);

结果

rate    ComputedRate
1/5     0.2000
1/2250  0.0004
7/16    0.4375

一些解释:

TSQL不允许动态评估可计算表达式......

字符串文字或动态SQL都有可能 第一个不允许动态值,第二个非常有限:没有内联,在视图或函数中没有用法等。

此查询将使用技巧将值1/2250拆分为<x>1</x><x>2250</x>。这允许将表达式转换为XML并分别查询<x>的第一次出现和第二次出现。这用于计算。