如何使此光标更改列值?

时间:2013-03-01 07:03:55

标签: sql sql-server

我是sql的新手,没有编写游标的经验。 我的表customer中有一个列名distance,其值为

distance

5miles
3km
6miles
null
6km

我想写一个游标,读取距离列的每个列数值 并且增加30%并将整数乘以0.62137并用单位里程替换列值。 有些人可以帮助我。或者给我一个想法,我迫切需要解决它。

3 个答案:

答案 0 :(得分:2)

您可以使用简单的查询进行尝试:

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

这里字符串被替换并乘以你的值,然后它被转换回字符串并与'miles'连接。

答案 1 :(得分: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语句中,我可以访问字符串的数字部分,转换为int(它可以很容易地成为float }),我也可以访问原始单位(如果我想根据这些单位做某事)。

这是我目前能做的最好的事情 - 你的问题很难确定究竟会发生什么样的转变(你提到增加了30%乘以0.62137)。所以我选择了:

  

给我一​​个想法

答案 2 :(得分: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