OracleとTiDBの機能と構文の比較
このドキュメントでは、Oracle と TiDB の関数と構文の比較について説明します。これは、Oracle関数に基づいて対応する TiDB関数を見つけ、Oracle と TiDB の構文の違いを理解するのに役立ちます。
ノート:
このドキュメントの関数と構文は、Oracle 12.2.0.1.0 および TiDB v5.4.0 に基づいています。他のバージョンでは異なる場合があります。
関数の比較
次の表は、いくつかの Oracle 関数と TiDB関数の比較を示しています。
| 関数 | Oracle の構文 | TiDB 構文 | ノート | 
|---|---|---|---|
| 値を特定の型としてキャストする | TO_NUMBER(key)TO_CHAR(key) | CONVERT(key,dataType) | TiDB は、値を次のタイプのいずれかとしてキャストすることをサポートしています: BINARY 、 CHAR 、 DATE 、 DATETIME 、 TIME 、 SIGNED INTEGER 、 UNSIGNED INTEGERおよびDECIMAL 。 | 
| 日付を文字列に変換する | TO_CHAR(SYSDATE,'yyyy-MM-dd hh24:mi:ss')TO_CHAR(SYSDATE,'yyyy-MM-dd') | DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')DATE_FORMAT(NOW(),'%Y-%m-%d') | TiDB のフォーマット文字列は大文字と小文字が区別されます。 | 
| 文字列を日付に変換する | TO_DATE('2021-05-28 17:31:37','yyyy-MM-dd hh24:mi:ss')TO_DATE('2021-05-28','yyyy-MM-dd hh24:mi:ss') | STR_TO_DATE('2021-05-28 17:31:37','%Y-%m-%d %H:%i:%s')STR_TO_DATE('2021-05-28','%Y-%m-%d%T') | TiDB のフォーマット文字列は大文字と小文字が区別されます。 | 
| 現在のシステム時刻を秒精度で取得します | SYSDATE | NOW() | |
| 現在のシステム時刻をマイクロ秒精度で取得します | SYSTIMESTAMP | CURRENT_TIMESTAMP(6) | |
| 2 つの日付間の日数を取得する | date1 - date2 | DATEDIFF(date1, date2) | |
| 2 つの日付間の月数を取得する | MONTHS_BETWEEN(ENDDATE,SYSDATE) | TIMESTAMPDIFF(MONTH,SYSDATE,ENDDATE) | Oracle のMONTHS_BETWEEN()と TiDB のTIMESTAMPDIFF()の結果は異なります。 TIMESTAMPDIFF()整数を返します。 2 つの関数のパラメータが入れ替わっていることに注意してください。 | 
日付にn日を追加します | DATEVAL + n | DATE_ADD(dateVal,INTERVAL n DAY) | nは負の値を指定できます。 | 
日付にn月を加算します | ADD_MONTHS(dateVal,n) | DATE_ADD(dateVal,INTERVAL n MONTH) | nは負の値を指定できます。 | 
| デートの日を取得する | TRUNC(SYSDATE) | CAST(NOW() AS DATE)DATE_FORMAT(NOW(),'%Y-%m-%d') | TiDB では、 CASTとDATE_FORMAT同じ結果を返します。 | 
| 日付の月を取得する | TRUNC(SYSDATE,'mm') | DATE_ADD(CURDATE(),interval - day(CURDATE()) + 1 day) | |
| 値を切り捨てる | TRUNC(2.136) = 2TRUNC(2.136,2) = 2.13 | TRUNCATE(2.136,0) = 2TRUNCATE(2.136,2) = 2.13 | データの精度は保たれます。対応する小数点以下の桁を四捨五入せずに切り捨てます。 | 
| シーケンス内の次の値を取得します | sequence_name.NEXTVAL | NEXTVAL(sequence_name) | |
| ランダムなシーケンス値を取得する | SYS_GUID() | UUID() | TiDB は、Universal Unique Identifier (UUID) を返します。 | 
| 左結合または右結合 | SELECT * FROM a, b WHERE a.id = b.id(+);SELECT * FROM a, b WHERE a.id(+) = b.id; | SELECT * FROM a LEFT JOIN b ON a.id = b.id;SELECT * FROM a RIGHT JOIN b ON a.id = b.id; | 相関クエリでは、TiDB は左結合または右結合に (+) を使用することをサポートしていません。代わりにLEFT JOINまたはRIGHT JOINを使用できます。 | 
NVL() | NVL(key,val) | IFNULL(key,val) | フィールドの値がNULLの場合、 valを返します。それ以外の場合は、フィールドの値を返します。 | 
NVL2() | NVL2(key, val1, val2) | IF(key is NULL, val1, val2) | フィールドの値がNULLでない場合はval1を返します。それ以外の場合はval2を返します。 | 
DECODE() | DECODE(key,val1,val2,val3)DECODE(value,if1,val1,if2,val2,...,ifn,valn,val) | IF(key=val1,val2,val3)CASE WHEN value=if1 THEN val1 WHEN value=if2 THEN val2,...,WHEN value=ifn THEN valn ELSE val END | val1の場合、 val2を返します。それ以外の場合はval3を返します。if1 ) を満たす場合、 val1を返します。条件 2 ( if2 ) を満たす場合はval2を返します。条件 3 ( if3 ) を満たす場合はval3を返します。 | 
文字列aとbを連結します | `'a' | 'b'` | |
| 文字列の長さを取得する | LENGTH(str) | CHAR_LENGTH(str) | |
| 指定された部分文字列を取得します | SUBSTR('abcdefg',0,2) = 'ab'SUBSTR('abcdefg',1,2) = 'ab' | SUBSTRING('abcdefg',0,2) = ''SUBSTRING('abcdefg',1,2) = 'ab' | |
| 部分文字列の位置を取得する | INSTR('abcdefg','b',1,1) | INSTR('abcdefg','b') | 'abcdefg'の最初の文字から検索し、最初に出現する'b'の位置を返します。 | 
| 部分文字列の位置を取得する | INSTR('stst','s',1,2) | LENGTH(SUBSTRING_INDEX('stst','s',2)) + 1 | 'stst'の最初の文字から検索し、2 番目に出現する's'の位置を返します。 | 
| 部分文字列の位置を取得する | INSTR('abcabc','b',2,1) | LOCATE('b','abcabc',2) | abcabcの 2 番目の文字から検索し、最初に出現したbの位置を返します。 | 
| 列の値を連結する | LISTAGG(CONCAT(E.dimensionid,'---',E.DIMENSIONNAME),'***') within GROUP(ORDER BY DIMENSIONNAME) | GROUP_CONCAT(CONCAT(E.dimensionid,'---',E.DIMENSIONNAME) ORDER BY DIMENSIONNAME SEPARATOR '***') | 指定した列の値を***区切り文字で 1 つの行に連結します。 | 
| ASCIIコードを文字に変換する | CHR(n) | CHAR(n) | Oracle の Tab ( CHR(9) )、LF ( CHR(10) )、および CR ( CHR(13) ) 文字は、TiDB のCHAR(9) 、 CHAR(10) 、およびCHAR(13)に対応します。 | 
構文の比較
このセクションでは、Oracle と TiDB の構文の違いについて説明します。
文字列の構文
Oracle では、文字列は一重引用符 ('') でのみ囲むことができます。たとえば'a' 。
TiDB では、文字列を一重引用符 ('') または二重引用符 ("") で囲むことができます。たとえば、 'a'と"a"です。
NULLと空の文字列の違い
Oracle はNULLと空の文字列''を区別しません。つまり、 NULLは''と同等です。
TiDB はNULLと空の文字列''を区別します。
INSERTステートメントでの同じテーブルへの読み取りと書き込み
Oracle は、 INSERTステートメントでの同じテーブルへの読み取りと書き込みをサポートしています。例えば:
INSERT INTO table1 VALUES (feild1,(SELECT feild2 FROM table1 WHERE...))
TiDB は、 INSERTステートメントでの同じテーブルへの読み取りと書き込みをサポートしていません。例えば:
INSERT INTO table1 VALUES (feild1,(SELECT T.fields2 FROM table1 T WHERE...))
クエリから最初の n 行を取得する
Oracle では、クエリから最初の n 行を取得するには、 ROWNUM <= n句を使用できます。たとえばROWNUM <= 10 。
TiDB では、クエリから最初の n 行を取得するには、 LIMIT n句を使用できます。たとえばLIMIT 10 。 Hibernate Query Language (HQL) で SQL ステートメントをLIMIT実行すると、エラーが発生します。 Hibernate ステートメントを SQL ステートメントに変更する必要があります。
UPDATEステートメントで複数のテーブルを更新します
Oracle では、複数のテーブルを更新するときに、特定のフィールドの更新関係をリストする必要はありません。例えば:
UPDATE test1 SET(test1.name,test1.age) = (SELECT test2.name,test2.age FROM test2 WHERE test2.id=test1.id)
TiDB では、複数のテーブルを更新する場合、特定のフィールドの更新関係をすべてSETにリストする必要があります。例えば:
UPDATE test1,test2 SET test1.name=test2.name,test1.age=test2.age WHERE test1.id=test2.id
派生テーブルの別名
Oracle では、複数のテーブルをクエリする場合、派生テーブルにエイリアスを追加する必要はありません。例えば:
SELECT * FROM (SELECT * FROM test)
TiDB では、複数のテーブルをクエリする場合、すべての派生テーブルに独自のエイリアスが必要です。例えば:
SELECT * FROM (SELECT * FROM test) t
集合演算
Oracle では、最初のクエリ結果には含まれるが 2 番目のクエリ結果には含まれない行を取得するには、 MINUSセット操作を使用できます。例えば:
SELECT * FROM t1 MINUS SELECT * FROM t2
TiDB はMINUS操作をサポートしていません。 EXCEPTセット運転が可能です。例えば:
SELECT * FROM t1 EXCEPT SELECT * FROM t2
コメントの構文
Oracle では、コメント構文は--Commentです。
TiDB では、コメント構文は-- Commentです。 TiDB では--後に空白があることに注意してください。
ページネーション
Oracle では、 OFFSET m ROWSを使用するとm行をスキップし、 FETCH NEXT n ROWS ONLYを使用するとn行をフェッチできます。例えば:
SELECT * FROM tables OFFSET 0 ROWS FETCH NEXT 2000 ROWS ONLY
TiDB では、 OFFSET m ROWS FETCH NEXT n ROWS ONLYをLIMIT n OFFSET mに置き換えることができます。例えば:
SELECT * FROM tables LIMIT 2000 OFFSET 0
NULL値の並べ替え順序
Oracle では、次の場合にNULL値がORDER BY句によってソートされます。
ORDER BY column ASCステートメントでは、最後にNULL値が返されます。ORDER BY column DESCステートメントでは、最初にNULL値が返されます。ORDER BY column [ASC|DESC] NULLS FIRSTステートメントでは、NULL 以外の値の前にNULL値が返されます。 NULL 以外の値は、ASC|DESCで指定された昇順または降順で返されます。ORDER BY column [ASC|DESC] NULLS LASTステートメントでは、NULL 以外の値の後にNULL値が返されます。 NULL 以外の値は、ASC|DESCで指定された昇順または降順で返されます。
TiDB では、次の場合にNULL値がORDER BY句によってソートされます。
ORDER BY column ASCステートメントでは、最初にNULL値が返されます。ORDER BY column DESCステートメントでは、最後にNULL値が返されます。
次の表に、Oracle と TiDB の同等のORDER BYステートメントの例をいくつか示します。
オラクルではORDER BY | TiDB の同等のステートメント | 
|---|---|
SELECT * FROM t1 ORDER BY name NULLS FIRST; | SELECT * FROM t1 ORDER BY name; | 
SELECT * FROM t1 ORDER BY name DESC NULLS LAST; | SELECT * FROM t1 ORDER BY name DESC; | 
SELECT * FROM t1 ORDER BY name DESC NULLS FIRST; | SELECT * FROM t1 ORDER BY ISNULL(name) DESC, name DESC; | 
SELECT * FROM t1 ORDER BY name ASC NULLS LAST; | SELECT * FROM t1 ORDER BY ISNULL(name), name; |