標籤:
需求:從目前的 test_a03order 表裡面提取出來產品規格,押金的資料
一.首先添加表欄位
我們在表裡面添加這兩個欄位 命名為product_size,deposit 後期進行更新這兩個欄位內容就可以了
1 ALTER TABLE test_a03order ADD product_size VARCHAR(255) AFTER productname;#在productname之後插入規格欄位2 ALTER TABLE test_a03order ADD deposit VARCHAR(255) AFTER price;#在price之後插入押金帶元字 僅此varchar 資料類型
插入要產生的新欄位
插入欄位成功
二、分析需求屬性
1、發現產品規格,押金資料是存在於productname中的因此我們需要先看資料表內有多少個product 觀察所有產品的命名規律
1 1 SELECT productname FROM test_a03order GROUP BY productname
查看幾個產品
結果在這個表裡有4個product 分別為 "心靈雞湯(押瓶1000元)10000ml*24瓶/箱”,”橫刀奪愛丸(押瓶888元)15粒/盒","腦殘片(押瓶99元)15片/盒","鬼迷心竅湯(押瓶888元)10000ml*12瓶/箱","鬼迷心竅湯(押瓶888元)10000ml*12瓶/箱",通過觀察productname都包含一個"押"字,product_size是在字串的最後一個字,deposit位於中間的括弧裡且在"瓶"字和"元"中間 因此可以使用 LEFT() RIGHT() CHAR_LENGTH()函數進行處理 。
2、擷取product_size
1 SELECT productname,RIGHT(productname,1) AS product_size2 FROM test_a03order3 WHERE productname LIKE "%押%"
擷取product_size
3、擷取deposit
# 我們一步一步來,先取出"瓶"字左面的左邊欄位(包含瓶這個字串本身),再取出"元"字左面的左邊欄位(包含元這個字串本身)
1 SELECT productname,2 LEFT(productname,INSTR(productname,"瓶"))AS deposit_left,3 LEFT(productname,INSTR(productname,"元")) AS deposit_leftall4 FROM test_a03order5 WHERE productname LIKE "%押%"
擷取deposit押金第一步
這時候發現deposit_leftall 包含deposit_left字串的全部,並且差異就在押金數值,且位於deposit_leftall 欄位的右面部分,用deposit_leftall減去deposit_left不就是押金呢 但字串類型不能加減呢,因此我們需要先計算上面deposit_left,deposit_leftall的長度 用它們的長度之差 作為right()函數的參數 截取 deposit_leftall
我們為什麼用char_length()而不用length()函數截取字元長度就在於length()預設一個漢字長度為3,CHAR_LENGTH()不論中英文都預設長度為1
所以現在重新寫下SQL
1 SELECT productname,2 LEFT(productname,INSTR(productname,"瓶")) AS deposit_left,3 LEFT(productname,INSTR(productname,"元")) AS deposit_leftall,4 CHAR_LENGTH(LEFT(productname,INSTR(productname,"瓶"))) AS deposit_left_length,5 CHAR_LENGTH(LEFT(productname,INSTR(productname,"元"))) AS deposit_leftall_length,6 RIGHT(LEFT(productname,INSTR(productname,"元")),CHAR_LENGTH(LEFT(productname,INSTR(productname,"元")))-CHAR_LENGTH(LEFT(productname,INSTR(productname,"瓶")))) AS deposit7 #上面right()這麼長代碼實質上就是right(deposit_leftall,deposit_leftall_length-deposit_left_length) 8 FROM test_a03order9 WHERE productname LIKE "%押%"
擷取deposit第二步
重新整理以下代碼把 product_size 和deposit都省去中間過程
1 SELECT productname,2 RIGHT(productname,1) AS product_size,3 RIGHT(LEFT(productname,INSTR(productname,"元")),CHAR_LENGTH(LEFT(productname,INSTR(productname,"元")))-CHAR_LENGTH(LEFT(productname,INSTR(productname,"瓶")))) AS deposit4 FROM test_a03order5 WHERE productname LIKE "%押%"
成功擷取deposit
三、更新資料表插入的兩個欄位
更新欄位內容
1 UPDATE test_a03order SET product_size=RIGHT(productname,1) WHERE productname LIKE "%押%";2 UPDATE test_a03order SET `deposit`=RIGHT(LEFT(productname,INSTR(productname,"元")),CHAR_LENGTH(LEFT(productname,INSTR(productname,"元")))-CHAR_LENGTH(LEFT(productname,INSTR(productname,"瓶")))) WHERE productname LIKE "%押%"
更新資料表新插入的兩個欄位
更新成功 執行查詢查看效果
1 SELECT * FROM test_a03order
查看更新效果
四、更新成功
MySQL文本處理函數2_20160921