是否可以从varchar单元格中提取数字,对它们进行数学运算并使用结果更新单元格?
IE
列中的单元格具有值“24a10 b”
取 24、10 并注意 b
做 24*10 = 240
如果有 ab,则减 1
在该字段中存储 239(将“24a10 b”更改为“239”)
对表中的所有行执行此操作
是否可以从varchar单元格中提取数字,对它们进行数学运算并使用结果更新单元格?
IE
列中的单元格具有值“24a10 b”
取 24、10 并注意 b
做 24*10 = 240
如果有 ab,则减 1
在该字段中存储 239(将“24a10 b”更改为“239”)
对表中的所有行执行此操作
这适用于您的示例:
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'
如果 col 以 ab 结尾,则为 true (=1),否则为 false (0)当然可以,但是 SQL 是围绕原子值公理(即第一范式)设计的。几乎不需要拆分字段。您需要在精心设计的数据库中使用它的唯一时间是您可能只想使用日期字段的月份或年份的日期。虽然你肯定会发现某些白痴设计的数据库违反了这个核心概念,但从试图弄清楚如何使用这些设计开始是个坏主意。
此外,您“存储在该单元格 239”的最后一步让我认为您仍在查看数据库,就像它们是电子表格一样。他们不是。数据库的另一个核心组件是行的顺序并不重要。另一方面,字段总是与同一行中的其他字段相关。您可以将其中一个字段的值设置为该记录的 ID 字段为 239 的值,但您通常不会关心记录是第 239 个这一事实。
也就是说,这里有一个查询可以做你想做的事:
假设:该字段的格式为“11a22 b”。也就是说,一个两位数,后跟一个字母,然后是另一个两位数,可能后跟一个空格和字母“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
如果有人正在寻找类似的东西,完整的答案是这样的:
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;