參考文檔
MySQL與Oracle 差異比較之五存儲過程&Function
Oracle中的decode與mysql中的if
Oracle中 decode(Emergency,1,'緊急','普通')
-
mysql中
select a.title,if(a.Emergency=1,'緊急','普通')emergency from already_sign a
Select title,case Emergency when 1 then '緊急' else '普通' End as emergency from already_sign
字符串拼接
oracle:Oralce只支持兩個字符串的拼接,若想拼接多個字符串可以嵌套使用concat, CONCAT(str1,str2)
Mysql支持多個字符串拼接: CONCAT(str1,str2,…)
日期處理
mysql : DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')
oracle: TO_CHAR(SYSDATE,'YYYY-MM-DD hh24:mi:ss')
nvl函數
mysql: ifnull(A.USER_KPI,0)
oracle: NVL(A.USER_KPI,0)
to_number
oracle的to_number
mysql不需要
字符串格式化
mysql:CONCAT
oracle:TO_CHAR
關鍵字、保留字
涉及到關鍵字,mysql關鍵字需要加上``號
mysql: PARA_VALUE as
KEY
oracle : PARA_VALUE as KEY
rownum
oracle自定義sql中如果使用了rownum=1
mysql中可以寫成limit 1
大小寫問題
在oracle中一般情況下不區分大小寫
但在MySQL中,所使用操作系統的大小寫敏感性決定了數據庫名和表名的大小寫敏感性。
解決的辦法是把mysql的數據庫名和oracle的大小寫保持一致,
表名與應用程序中sql字符串中的表名保持一致,
如果應用程序中字段名用了雙引號,那請把sql中的字段名大小寫與雙引號里的字符保持一致。
如果你的應用程序所引用的表名、字段沒有統一大小寫,那麻煩就大了。
字符串截取
- mysql
截取log_data從逗號開始之后的字符:
SELECT substring_index(log_data,',',-1)
FROM nbts.log where event_id='150002' and log_id ='a2a421734c7e47dd8a8b';
截取log_data從逗號開始之前的字符:
SELECT substring_index(log_data,',',1)
FROM nbts.log where event_id='150002' and log_id ='a2a421734c7e47dd8a8b';
- oracle
截取log_data從逗號開始之后的字符:
SELECT SUBSTR(log_data, INSTR(log_data, ',', 1, 1) +1) AS app_ver_id
FROM nbts.log where event_id='150002' and log_id ='a2a421734c7e47dd8a8b';
截取log_data從逗號開始之前的字符:
SELECT SUBSTR(log_data,0,INSTR(log_data, ',', 1, 1) - 1) AS app_ver_id
FROM nbts.log where event_id='150002' and log_id ='a2a421734c7e47dd8a8b';
主鍵生成策略
創建一個專門記錄序列的表sequence,記錄有當前序列號,序列的間隔如+1
創建記錄當前序列的表
DROP TABLE
IF EXISTS sequence;
CREATE TABLE sequence (
NAME VARCHAR (50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (NAME)
) ENGINE = INNODB;
INSERT INTO sequence VALUES ('MovieSeq',3,5);
創建一個獲取當前序列的function
DROP FUNCTION IF EXISTS currval;
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value
FROM sequence
WHERE name = seq_name;
RETURN value;
END;
獲取下一個數值..先在sequence里面調用update當前最大數值+1然后再調用currval獲得當前數值
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
UPDATE sequence
SET current_value = current_value + increment
WHERE name = seq_name;
RETURN currval(seq_name);
END$
DELIMITER ;
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
RETURNS INTEGER
CONTAINS SQL
BEGIN
UPDATE sequence
SET current_value = value
WHERE name = seq_name;
RETURN currval(seq_name);
END$
DELIMITER ;
如果以上語句執行有異常請先執行這句:set global logbintrustfunctioncreators=TRUE;
插入時的主鍵生成:
mysql: SELECT MMC.NEXTVAL('SEQ_MD_ENTITY_ATTRIBUTE')
oracle: select MMC.SEQ_MD_ENTITY_ATTRIBUTE.nextval from dual