我有一个名为table
的{{1}},因为有一个transactions
即column
数据类型rate
。
nvarchar
,column
的值类似于rate
。
我正在寻找一个查询,如果我运行该查询,我应该得到答案1/2250
。
如下所示
0.0004
我正在寻找的输出是Select cast(rate as int) as rate from transactions
,但现在我得到0.0004
感谢。
答案 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>
的第一次出现和第二次出现。这用于计算。