前幾天吧系統從oracle往mysql上遷移,不少的語句是比較簡單的,就是一些函數的修改如to-date等java
可是也有幾個比較棘手的,這裏記錄下mysql
第1、row_number() over(partition by sql
首先要了解下oracle中這個函數的用法,看個例子數組
select t.*,row_number() over(partition by t.owner order by y.createDate desc) rn from test toracle
這個語句的意思就是,把test這個表的數據按照owner 分組而且給每一個分組的裏面的數據加上一個序列號,數據格式以下函數
id name owner createDate rnspa
1 aa 001 1.net
2 bb 001 2orm
3 cc 001 3blog
4 dd 002 1
5 ee 002 2
6 ff 003 1
數據搞得不太正規,可是應該可以看懂它的意思吧,
可是在mysql中是沒有這個函數的因而乎,找啊找,總算找了個解決方法,以下
SELECT
heyf_tmp.*,
IF(@pdept=heyf_tmp.owner ,@rn:=@rn+1,@rn:=1) AS rn,
@pdept:=heyf_tmp.owner
FROM
(
SELECT
yv.*
FROM
test yv
ORDER BY
yv.owner ,
yv.createDate DESC
)
heyf_tmp ,
(
SELECT
@rn :=0 ,
@pdept := NULL ,
@rn:=0
)
aa
具體是什麼意思,不是很清楚,不過先解決問題再說
第2、oracle樹形查詢
oracle樹形查詢現成的方法
select distinct t.id as id, t.name
from test t
start with id=‘’
connect by prior id = parentid
可是mysql中是沒有這個方法的,因而只能本身定義函數或者過程,我這裏用的是過程
以下
CREATE PROCEDURE Pro_GetTreeList`(in pid varchar(36))
begin
declare lev int;
set lev=1;
drop table if exists tmp1;
CREATE TABLE tmp1(id VARCHAR(40),name varchar(50),parentid varchar(40) ,levv INT);
INSERT tmp1 SELECT id,name,parent_id,1 FROM `test` WHERE parent_id=pid;
while row_count()>0
do set lev=lev+1;
INSERT tmp1 SELECT t.id,t.name,t.parent_id,lev from testt join tmp1 a on t.parent_id=a.id AND levv=lev-1;--查出子節點
end while ;
INSERT tmp1 SELECT id,name,parent_id,0 FROM test WHERE id=pid; --查出當前節點
end
這個存儲過程應該都能看懂吧,就不作多解釋了
第三 、函數中定義相似一維、二維數組,
oracle中能夠直接定義的,如
return number is newList := NewList((1,2,3),(4,5,6));這樣能夠直接返回 return newList(1,2) 返回的就是2了,
可是mysql中卻不能這樣寫的,不過也有這樣的方法解決:
對於一維的來講,很簡單,有函數的elt函數,能夠直接return elt(index,'1','2','3'); 若是elt(3,'1','2','3') 這樣返回的就是 3了,
不過對於二維的來講好像沒有現成的函數用了,個人解決方法是改爲個表來作,把數據錄入到表中,而後去查表,這丫要給你也是能夠實現
第4、 mysql中獲取漢字的首個大寫字母
mysql中遇到了這樣的一個問題,網上找到了方法,轉載地址://http://blog.csdn.net/lky5387/article/details/11973721
DROP FUNCTION IF EXISTS `getPY`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `getPY`(in_string VARCHAR(65534)) RETURNS mediumtext CHARSET utf8
BEGIN
DECLARE tmp_str VARCHAR(65534) charset gbk DEFAULT '' ; #截取字符串,每次作截取後的字符串存放在該變量中,初始爲函數參數in_string值
DECLARE tmp_len SMALLINT DEFAULT 0;#tmp_str的長度
DECLARE tmp_char VARCHAR(2) charset gbk DEFAULT '';#截取字符,每次 left(tmp_str,1) 返回值存放在該變量中
DECLARE tmp_rs VARCHAR(65534) charset gbk DEFAULT '';#結果字符串
DECLARE tmp_cc VARCHAR(2) charset gbk DEFAULT '';#拼音字符,存放單個漢字對應的拼音首字符
SET tmp_str = in_string;#初始化,將in_string賦給tmp_str
SET tmp_len = LENGTH(tmp_str);#初始化長度
WHILE tmp_len > 0 DO #若是被計算的tmp_str長度大於0則進入該while
SET tmp_char = LEFT(tmp_str,1);#獲取tmp_str最左端的首個字符,注意這裏是獲取首個字符,該字符多是漢字,也可能不是。
SET tmp_cc = tmp_char;#左端首個字符賦值給拼音字符
IF LENGTH(tmp_char)>1 THEN#判斷左端首個字符是多字節仍是單字節字符,要是多字節則認爲是漢字且做如下拼音獲取,要是單字節則不處理。
SELECT ELT(INTERVAL(CONV(HEX(tmp_char),16,10),0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC
,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA ,0xCEF4,0xD1B9,0xD4D1),
'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z') INTO tmp_cc; #得到漢字拼音首字符
END IF;
SET tmp_rs = CONCAT(tmp_rs,tmp_cc);#將當前tmp_str左端首個字符拼音首字符與返回字符串拼接
SET tmp_str = SUBSTRING(tmp_str,2);#將tmp_str左端首字符去除
SET tmp_len = LENGTH(tmp_str);#計算當前字符串長度
END WHILE;
RETURN tmp_rs;#返回結果字符串
END;;
DELIMITER ;
第4、 圖片clob的修改
系統中的功能是把圖片存在blob字段中的,,原來用的是oracle,java中對應的字段是Object,可是mysql中若是這樣作卻不能獨處圖片,緣由多是由於在往Object中寫數據時出錯了,這個號解決,只要把java中對應字段的類型改爲byte[] 就好了