是否可以從varchar單元格中提取數字,然後與它們進行數學運算並用結果更新單元格?從* varchar *單元格中提取數字,並在純mysql中與它們進行數學運算
即
在一個列中的單元具有值 「24a10 b」 的
取24,10,並注意在B
做24 * 10 = 240
如果有ab,則減去1
店239在這一領域(改變「24a10 B」到「239」)
與表中的所有行做到這一點
是否可以從varchar單元格中提取數字,然後與它們進行數學運算並用結果更新單元格?從* varchar *單元格中提取數字,並在純mysql中與它們進行數學運算
即
在一個列中的單元具有值 「24a10 b」 的
取24,10,並注意在B
做24 * 10 = 240
如果有ab,則減去1
店239在這一領域(改變「24a10 B」到「239」)
與表中的所有行做到這一點
萬一有人正在尋找類似的東西,在完整的答案是這樣的:
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;
這適用於你的例子:
SELECT
(col * SUBSTRING_INDEX(col, 'a', -1)) - (RIGHT(col, 1)='B')
FROM
op
請參閱小提琴here。
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)否則爲假(0)-1在SUBSTRING_INDEX中意味着什麼? – 2013-02-27 17:57:26
使用-1它返回分隔符'a'右側的所有內容,請參閱http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_substring-index,當然它只有在字符串中存在單個'a'時,我編輯我的回答有點 – fthiella 2013-02-27 20:45:19
以及如何在該字段中存儲239(將'24a10 b'更改爲'239')和 對所有行執行此操作在桌子上? – 2013-02-28 18:34:38
它當然可以完成,但SQL是圍繞原子值的公理設計的(即first normal form)。拆分字段幾乎是不必要的。關於您唯一需要在精心設計的數據庫中使用它的時間,您可能希望僅使用日期字段的月份或年份來處理日期。雖然你肯定會發現一些你被迫使用的白癡設計的數據庫違反了這個核心概念,但試圖弄清楚如何使用這些設計來開始是一個糟糕的主意。
此外,「存儲在該單元格239」中的最後一步使我認爲您仍然在查看數據庫,如他們的電子表格。他們不是。數據庫的另一個核心組件是行的順序並不重要。另一方面,字段總是與同一行中的其他字段相關聯。您可以將其中一個字段的值設置爲該記錄的ID字段爲239的值,但您通常不會關心記錄爲239的事實。
這就是說,這裏是一個查詢,將你想要做什麼:
Assumtion:該字段的格式是「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
很好的解釋。我想我並沒有很好地解釋自己的儲蓄問題。我想將239存儲在「24a10 b」所在的字段中。換句話說:我想用基於先前值生成的新值更新表中所有行的「值」字段。 – 2013-02-27 17:36:17
爲什麼你需要它,爲什麼你需要它在純SQL? – 2013-02-26 22:03:54
沒有存儲過程似乎不可能。 – 2013-02-26 22:04:17
我想了解更多的SQL,並想知道如果這樣的事情是可能的只有查詢 – 2013-02-26 22:06:37