Sql 如何使此光标更改列值?

Sql 如何使此光标更改列值?,sql,sql-server,Sql,Sql Server,我是sql新手,没有编写游标的经验。 我的customer表中有一个列名distance,其值如下 distance 5miles 3km 6miles null 6km 我想写一个游标,读取每列距离列的数值 增加30%,将整个数字乘以0.62137,并用单位英里替换列值。 谁能帮我一下吗。或者给我一个主意,我急需修复它。您可以通过一个简单的查询来尝试: SELECT CAST(CAST(REPLACE(REPLACE(distance, 'km' , '' ), 'miles', '')a

我是sql新手,没有编写游标的经验。 我的customer表中有一个列名
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

在这里,字符串被替换并与您的值相乘,然后它被转换回字符串并与“英里”关联。

您可以通过一个简单的查询来尝试:

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

在这里,字符串被替换并与您的值相乘,然后它被转换回字符串并与“miles”关联。

我不清楚您想要执行什么计算,或者用miles替换列值是什么意思。但我会给你一个开始:

--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的乘法)。所以我选择了:

给我一个主意


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

--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的乘法)。所以我选择了:

给我一个主意

对答案稍加改进:

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
对答案稍加改进:

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

你有这样的价值观吗?或者有两个列,一个表示距离(数字),一个表示描述(字符串)?没有,我只有一列这样的值,字符串。然后,如果必须用这些值计算任何内容,我会重新考虑数据库设计。数据库是这样的,只有不能更改,这是一个大项目,而且已经存在很长时间了。请帮我做这个……远离光标。您不想要或不需要光标。但是您之所以选择它,是因为如果您是从过程的角度来学习SQL编程,它看起来很熟悉。您有这样的值吗?或者有两个列,一个表示距离(数字),一个表示描述(字符串)?没有,我只有一列这样的值,字符串。然后,如果必须用这些值计算任何内容,我会重新考虑数据库设计。数据库是这样的,只有不能更改,这是一个大项目,而且已经存在很长时间了。请帮我做这个……远离光标。您不想要或不需要光标。但您之所以选择它,是因为如果您是从过程的角度来学习SQL编程,它看起来很熟悉。为什么要使用联接?如果只对表d进行更新,结果也是一样的。为什么要使用联接?如果只更新表d,则结果相同。