我是 sql 新手,没有编写游标的经验。distance
我的表客户中有一个列名,具有这样的值
distance
5miles
3km
6miles
null
6km
我想编写一个游标,读取距离列的每列数值并增加 30% 并将整个数字乘以 0.62137 并将列值替换为单位英里。有人可以帮我解决这个问题。或者给我一个想法,我急需修复它。
我是 sql 新手,没有编写游标的经验。distance
我的表客户中有一个列名,具有这样的值
distance
5miles
3km
6miles
null
6km
我想编写一个游标,读取距离列的每列数值并增加 30% 并将整个数字乘以 0.62137 并将列值替换为单位英里。有人可以帮我解决这个问题。或者给我一个想法,我急需修复它。
你可以用一个简单的查询来试试:
SELECT CAST(CAST(REPLACE(REPLACE(distance, 'km' , '' ), 'miles', '')as float) * 1.3 * 0.62137 AS VARCHAR) + ' miles'
FROM customer
在这里,字符串被替换并乘以您的值,然后将其转换回字符串并与“英里”连接。
我不清楚您要执行哪些计算,或者用英里替换列值是什么意思。但我会告诉你一个开始:
--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)。所以我去了:
给个主意
改进的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