0

我是 sql 新手,没有编写游标的经验。distance我的表客户中有一个列名,具有这样的值

distance

5miles
3km
6miles
null
6km

我想编写一个游标,读取距离列的每列数值并增加 30% 并将整个数字乘以 0.62137 并将列值替换为单位英里。有人可以帮我解决这个问题。或者给我一个想法,我急需修复它。

4

3 回答 3

2

你可以用一个简单的查询来试试:

SELECT CAST(CAST(REPLACE(REPLACE(distance, 'km' , '' ), 'miles', '')as float) * 1.3 * 0.62137 AS VARCHAR) + ' miles'
FROM customer

在这里,字符串被替换并乘以您的值,然后将其转换回字符串并与“英里”连接。

于 2013-03-01T07:25:02.060 回答
1

我不清楚您要执行哪些计算,或者用英里替换列值是什么意思。但我会告诉你一个开始:

--Your sample data
declare @t table (distance varchar(20) null)
insert into @t (distance) values
('5miles'),('3km'),('6miles'),(null),('6km')

--A possible update
; with Positioned as (
    select distance, PATINDEX('%[a-z]%',distance) as FirstLetter from @t
), Converted as (
    select distance,FirstLetter,CONVERT(int,SUBSTRING(distance,1,FirstLetter-1)) as Number from Positioned
)
update Converted set distance = CONVERT(varchar(20), Number * 0.6174) + 'miles ' + SUBSTRING(distance,FirstLetter,8000)

select * from @t

这会产生以下结果:

distance
--------------------
3.0870miles miles
1.8522miles km
3.7044miles miles
NULL
3.7044miles km

您会注意到,在UPDATE语句中,我可以访问字符串的数字部分,转换为 an int(它可以很容易地是 a float),并且我还可以访问原始单位(如果我想做一些基于那些)。

这是我目前能做的最好的事情——你的问题很不清楚到底要发生什么转变(你提到了增加 30%乘以 0.62137)。所以我去了:

给个主意

于 2013-03-01T07:25:24.133 回答
1

改进的Obl Tobl回答一点:

UPDATE d    
SET 
    d.dist = CAST(CAST(REPLACE(REPLACE(d1.dist, 'km', ''), 'miles', '') as FLOAT) * 1.3 * 0.62137 AS VARCHAR) + 'miles'
FROM distance d
INNER JOIN distance d1
    ON d.id = d1.id
于 2013-03-01T07:40:07.317 回答