是否可以从varchar单元格中提取数字,用它们进行数学运算并使用结果更新单元格?
。
-
列中的单元格值为" 24a10b "
-
取24路,10路,注意b
-
do 24*10 = 240
-
如果有b则减去1
-
在该字段中存储239(将' 24a10b '更改为'239')
-
对表中的所有行执行此操作
这当然可以做到,但是SQL是围绕原子值公理设计的(即第一范式)。拆分字段几乎没有必要。在设计良好的数据库中,只有在处理日期时才需要使用它,因为您可能只想处理日期字段的月份或年份。虽然你肯定会发现一些白痴设计的数据库违背了这个核心概念,但一开始就试图弄清楚如何使用这些设计是一个坏主意。
此外,你的最后一步"存储在那个单元格239"让我认为你仍然在看数据库,就像它们是电子表格一样。他们不是。数据库的另一个核心组件是行顺序并不重要。另一方面,字段总是与同一行中的其他字段相关。您可以将其中一个字段的值设置为该记录的ID字段为239的值,但您通常不会关心记录是第239条这一事实。
也就是说,这里有一个查询将做你想做的:
假设:字段格式为"11a22b"。也就是说,一个两位数,后面跟着一个字母,后面跟着另一个两位数,可能后面跟着一个空格和字母'b'。
SELECT CAST(SUBSTRING(Value,1,2) AS INT)
* CAST(SUBSTRING(Value,3,2) AS INT)
+ CASE RIGHT(Value,1) WHEN 'b' THEN -1 ELSE 0 END
FROM MyTable
这适用于您的示例:
SELECT
(col * SUBSTRING_INDEX(col, 'a', -1)) - (RIGHT(col, 1)='B')
FROM
op
请参阅此处。
-
col
是您的值'24a10 b'
-
SUBSTRING_INDEX(col, 'a', -1)
返回'a'右边的字符串部分,即'10 b'
-
'24a10 b' * '10 b'
的乘法自动将字符串转换为整数24*10
-
RIGHT(col,1)='B'
为true(=1),如果col以b结尾,则为false(0),否则
如果有人正在寻找类似的东西,完整的答案是这样的:
UPDATE `table`
SET cell = (
CAST( SUBSTRING( cell, 1, 2 ) AS UNSIGNED )
*
CAST( SUBSTRING( cell, 4, 2 ) AS UNSIGNED )
-
(SUBSTRING( latitud, 7, 1 ) = 'b')
)
WHERE 1;