暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

几个开源数据库和插件对 Oracle 字段类型和函数的兼容情况

原创 张玉龙 2022-04-03
1465

备注:

  • 对标 Oracle 的版本:11.2.0.4
  • 为了美化表格显示,将以下数据库名称进行简写
    • PostgreSQL --> PGSQL
    • openGauss --> OG
  • 本文仅供参考

DUAL 表的支持

表名 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
DUAL N Y N N Y Y

ROWNUM 的支持

类型 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
ROWNUM N N Y Y N N
  • 测试示例:
select * from emp where rownum <= 8;
  • PostgreSQL 替代 ROWNUM 的方式
-- limit postgres=# select * from emp limit 8; -- 窗口函数 row_number() over () SELECT * FROM (SELECT row_number() OVER () rownum, * FROM emp) b WHERE rownum <= 8;

字段类型

备注:这里的支持理解为能否在数据库中直接创建带有以下类型的表,而并非转换其他类型。

字段 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
CHAR Y Y Y Y Y Y
VARCHAR2 N Y Y Y N Y
NVARCHAR2 N Y Y Y N Y
NUMBER N N Y Y N Y
FLOAT Y Y Y Y Y Y
DATE 只存储日期 Y Y Y 只存储日期 Y
TIMESTAMP(6) Y Y Y Y Y Y
BLOB N N Y Y Y N
CLOB N N Y Y N N
NCLOB N N N N N N
LONG N N N N Y N
LONG RAW N N N N N N
RAW N N Y Y N N

函数

以下仅对Oracle的函数和相关数据库做了简单查询使用的对比,针对复杂情况请自行测试,本文仅供参考。

字符函数

函数 说明
ASCII(X) 返回字符X的ASCII码
CONCAT(X,Y) 连接字符串X和Y
INSTR(X,STR[,START][,N]) 从X中查找str,可以指定从start开始,也可以指定从n开始
LENGTH(X) 返回X的长度(字符个数)
LENGTHB(X) 返回X的长度(字节数)
LOWER(X) X转换成小写
UPPER(X) X转换成大写
INITCAP(X) 将X中的第一个字母转换成大写
LTRIM(X[,TRIM_STR]) 把X的左边截去trim_str字符串,缺省截去空格
RTRIM(X[,TRIM_STR]) 把X的右边截去trim_str字符串,缺省截去空格
TRIM([TRIM_STR FROM]X) 把X的两边截去trim_str字符串,缺省截去空格
REPLACE(X,old,new) 在X中查找old,并替换成new
SUBSTR(X,start[,length]) 返回X的字串,从start处开始,截取length个字符,缺省length,默认到结尾
SUBSTRB(X,start[,length]) -
LPAD(x,n,y) 在字符串x的左边补齐空格,得到总长为n个字符的字符串。其中y是可选项,这个参数用于指定左边补齐的字符串
RPAD(x,n,y) 在字符串x的右边补齐空格,得到总长为n个字符的字符串。其中y是可选项,这个参数用于指定右边补齐的字符串
- -
CHR(n) -
NCHR(number) -
NLS_INITCAP(char) -
NLS_LOWER(char) -
NLS_UPPER(char) -
NLSSORT(char) -
REGEXP_REPLACE(source_char,pattern,replace_string) -
REGEXP_SUBSTR(source_char,pattern) -
REGEXP_COUNT(source_char,pattern) -
REGEXP_INSTR(source_char,pattern) -
SOUNDEX(char) -
TRANSLATE(expr,from_string,to_string) -

上面各函数在 Oracle 中执行的例子

SQL> SELECT ASCII('a') a FROM dual; --97 SQL> SELECT CONCAT('Hello','world') a FROM dual; --Helloworld SQL> SELECT INSTR('Hello world','or') a FROM dual; --8 SQL> SELECT LENGTH('Hello') a FROM dual; --5 SQL> SELECT LENGTHB('Hello') a FROM dual; --5 SQL> SELECT LOWER('Hello') a FROM dual; --hello SQL> SELECT UPPER('hello') a FROM dual; --HELLO SQL> SELECT INITCAP('hello') a FROM dual; --HELLO SQL> SELECT LTRIM('=Hello=','=') a FROM dual; --Hello= SQL> SELECT RTRIM('=Hello=','=') a FROM dual; --=Hello SQL> SELECT TRIM('='FROM'=Hello=') a FROM dual; --Hello SQL> SELECT REPLACE('ABCDE','CD','AAA') a FROM dual; --ABAAAE SQL> SELECT SUBSTR('ABCDE',2,3) a FROM dual; --BCD SQL> SELECT SUBSTRB('ABCDE',2,3) a FROM dual; --BCD SQL> select LPAD('hElloWoRlD',15,'&') a from dual; --&&&&&hElloWoRlD SQL> select RPAD('hElloWoRlD',15,'&') a from dual; --hElloWoRlD&&&&& SQL> SELECT CHR(67)||CHR(65)||CHR(84) "Dog" from dual; --CAT SQL> SELECT NCHR(187) from dual; --> SQL> SELECT NLS_INITCAP('ijsland') "a" from dual; --Ijsland SQL> SELECT NLS_LOWER('ijsland') "a" from dual; --ijsland SQL> SELECT NLS_UPPER('ijsland') "a" from dual; --IJSLAND SQL> SELECT NLSSORT('ijsland') "a" from dual; --696A736C616E6400 SQL> SELECT REGEXP_REPLACE('500 Oracle Parkway, Redwood Shores, CA', '( ){2,}', ' ') "REGEXP_REPLACE" FROM DUAL; --500 Oracle Parkway, Redwood Shores, CA SQL> SELECT REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA', ',[^,]+,') "REGEXPR_SUBSTR" FROM DUAL; --, Redwood Shores, SQL> SELECT REGEXP_COUNT('123123123123', '123', 3, 'i') COUNT FROM DUAL; --3 SQL> SELECT REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA', '[^ ]+', 1, 6) "REGEXP_INSTR" FROM DUAL; --37 SQL> select SOUNDEX('b') from dual; --B000 SQL> SELECT TRANSLATE('SQL*Plus User''s Guide', ' */''', '___') FROM DUAL; --SQL_Plus_Users_Guide
函数 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
ASCII Y Y Y Y Y Y
CONCAT Y Y Y Y Y Y
INSTR N Y Y Y Y Y
LENGTH Y Y Y Y Y Y
LENGTHB N Y Y Y N Y
LOWER Y Y Y Y Y Y
UPPER Y Y Y Y Y Y
INITCAP Y Y Y Y N Y
LTRIM Y Y Y Y N Y
RTRIM Y Y Y Y N Y
TRIM Y Y Y Y Y Y
REPLACE Y Y Y Y Y Y
SUBSTR Y Y Y Y Y Y
SUBSTRB N Y Y Y N Y
LPAD Y Y Y Y Y Y
RPAD Y Y Y Y Y Y
- - - - - - -
CHR Y Y Y Y N Y
NCHR N N N N N N
NLS_INITCAP N N N N N N
NLS_LOWER N N N N N N
NLS_UPPER N N N N N N
NLSSORT N Y N N N Y
REGEXP_REPLACE 结果不一致 Y 结果不一致 结果不一致 Y Y
REGEXP_SUBSTR N Y Y Y Y Y
REGEXP_COUNT N Y N N N Y
REGEXP_INSTR N Y N N Y Y
SOUNDEX N N N N Y N
TRANSLATE Y Y Y Y N Y
SQL> select trim(' helloworld ') from dual; TRIM('HELL ---------- helloworld mysql> select trim(' helloworld ') from dual; +----------------------------+ | trim(' helloworld ') | +----------------------------+ | helloworld | +----------------------------+ 1 row in set (0.00 sec)

数字函数

函数 说明 示例
ABS(X) X的绝对值 ABS(-3)=3
COS(X) X的余弦 COS(1)=0.540302306
ACOS(X) X的反余弦 ACOS(1)=0
SIN(X) X的正弦 SIN(1)=0.841470985
ASIN(X) X的反正弦 ASIN(1)=1.57079633
TAN(X) X的正切 TAN(1)=1.55740772
ATAN(X) X的反切 ATAN(1)=0.785398163
CEIL(X) 大于或等于X的最小值 CEIL(5.4)=6
FLOOR(X) 小于或等于X的最大值 FLOOR(5.8)=5
LOG(X,Y) X为底Y的对数 LOG(2,4)=2
MOD(X,Y) X除以Y的余数 MOD(8,3)=2
POWER(X,Y) X的Y次幂 POWER(2,3)=8
ROUND(X[,Y]) X在第Y位四舍五入 ROUND(3.456,2)=3.46
SQRT(X) X的平方根 SQRT(4)=2
TRUNC(X[,Y]) X在第Y位截断 TRUNC(3.456,2)=3.45
- - -
ATAN2(n1,n2) - ATAN2(.3, .2)=0.982793723
BITAND(expr1,expr2) - BITAND(6,3)=2
COSH(n) - COSH(0)=1
EXP(n) - EXP(4)=54.59815
LN(n) - LN(95)=4.55387689
NANVL(n2,n1) - -
REMAINDER(n2,n1) - -
SIGN(n) - SIGN(-15)=-1
SINH(n) - SINH(1)=1.17520119
TANH(n) - TANH(.5)=0.462117157
WIDTH_BUCKET(expr, min_value, max_value, num_buckets) - -
函数 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
ABS Y Y Y Y Y Y
COS Y Y Y Y Y Y
ACOS Y Y Y Y Y Y
SIN Y Y Y Y Y Y
ASIN Y Y Y Y Y Y
TAN Y Y Y Y Y Y
ATAN Y Y Y Y Y Y
CEIL Y Y Y Y Y Y
FLOOR Y Y Y Y Y Y
LOG Y Y Y Y Y 显式转换
MOD Y Y Y Y Y Y
POWER Y Y Y Y Y Y
ROUND (number) Y Y Y Y Y Y
SQRT Y Y Y Y Y Y
TRUNC (number) Y Y Y Y N Y
- - - - - - -
ATAN2 Y Y Y Y Y Y
BITAND N Y Y Y N Y
COSH Y Y N N N Y
EXP Y Y Y Y Y Y
LN Y Y Y Y Y Y
NANVL N Y N N N Y
REMAINDER N N N N N N
SIGN Y Y Y Y Y Y
SINH Y Y N N N Y
TANH Y Y N N N Y
WIDTH_BUCKET Y Y Y Y - Y

以下情况为什么需要显式转换呢

oracle=# \df LOG List of functions Schema | Name | Result data type | Argument data types | Type ------------+------+------------------+---------------------+------ oracle | log | "number" | "number" | func oracle | log | "number" | "number", "number" | func pg_catalog | log | double precision | double precision | func pg_catalog | log | numeric | numeric | func pg_catalog | log | numeric | numeric, numeric | func (5 rows) oracle=# select LOG(2,4) a from dual; ERROR: function log(integer, integer) is not unique LINE 1: select LOG(2,4) a from dual; ^ HINT: Could not choose a best candidate function. You might need to add explicit type casts. oracle=# show search_path; search_path ---------------------------- public, oracle, pg_catalog (1 row) oracle=# select LOG(2::number,4) a from dual; a --- 2 (1 row) oracle=# select LOG(2::numeric,4) a from dual; a -------------------- 2.0000000000000000 (1 row)

NANVL

SQL> CREATE TABLE float_point_demo (dec_num NUMBER(10,2), bin_double BINARY_DOUBLE, bin_float BINARY_FLOAT); Table created. SQL> INSERT INTO float_point_demo VALUES (0,'NaN','NaN'); 1 row created. SQL> SELECT * FROM float_point_demo; DEC_NUM BIN_DOUBLE BIN_FLOAT ---------- ---------- ---------- 0 Nan Nan SQL> SELECT bin_float, NANVL(bin_float,0) FROM float_point_demo; BIN_FLOAT NANVL(BIN_FLOAT,0) ---------- ------------------ Nan 0

BINARY_DOUBLE 和 BINARY_FLOAT 字段类型只有 openGauss 2.1 支持创建

openGauss=# CREATE TABLE float_point_demo (bin_double BINARY_DOUBLE, bin_float BINARY_FLOAT); CREATE TABLE openGauss=# \d+ float_point_demo Table "public.float_point_demo" Column | Type | Modifiers | Storage | Stats target | Description ------------+------------------+-----------+---------+--------------+------------- bin_double | double precision | | plain | | bin_float | real | | plain | | Has OIDs: no Options: orientation=row, compression=no

日期函数

函数 说明
SYSDATE 获得当前系统时间
ADD_MONTHS(d,n) 在某一个日期 d 上,加上指定的月数 n,返回计算后的新日期。
LAST_DAY(d) 返回指定日期当月的最后一天。
MONTHS_BETWEEN(x,y) 给出Date(y) - Date(x) 的月数(可以是小数)
NEXT_DAY(x,day) 返回从x开始一周内,下一个day的日期,这里的day为星期
EXTRACT(fmt FROM d) 提取日期中的特定部分。
ROUND(d[,fmt]) 返回一个以 fmt 为格式的四舍五入日期值, d 是日期, fmt 是格式
TRUNC(d[,fmt]) 返回一个以 fmt 为格式的截断日期值(不进行四舍五入), d 是日期, fmt 是格式
TO_CHAR(datetime/interval) 将日期格式转为字符格式
- -
CURRENT_DATE -
CURRENT_TIMESTAMP -
DBTIMEZONE -
SESSIONTIMEZONE -
FROM_TZ(timestamp_value,time_zone_value) -
SYSTIMESTAMP -
LOCALTIMESTAMP -
NEW_TIME(date,timezone1,timezone2) -
NUMTODSINTERVAL(n,interval_unit) -
NUMTOYMINTERVAL(n,interval_unit) -
SYS_EXTRACT_UTC(datetime_with_timezone) -
TO_DSINTERVAL -
TO_TIMESTAMP -
TO_TIMESTAMP_TZ -
TO_YMINTERVAL -
TZ_OFFSET -

上面各函数在 Oracle 中执行的例子

SQL> select sysdate from dual; --2022-04-02 23:10:36 SQL> select add_months(sysdate,2) from dual; --2022-06-02 23:10:59 SQL> select last_day(sysdate) from dual; --2022-04-30 23:11:25 SQL> select months_between(sysdate,to_date('20181120','yyyymmdd')) a from dual; --40.4505373 SQL> select next_day(sysdate,'Monday') from dual; --2022-04-04 23:12:45 SQL> select extract(YEAR FROM SYSDATE) "year" from dual; --2022 SQL> select round(to_date('20190715','yyyymmdd'),'month') from dual; --2019-07-01 00:00:00 SQL> select round(to_date('20190716','yyyymmdd'),'month') from dual; --2019-08-01 00:00:00 SQL> select trunc(to_date('20190716','yyyymmdd'),'month') from dual; --2019-07-01 00:00:00 SQL> select trunc(sysdate,'year') from dual; --2022-01-01 00:00:00 SQL> SELECT TO_CHAR(sysdate) FROM DUAL; --2022-04-03 07:53:06 SQL> SELECT CURRENT_DATE FROM DUAL; --2022-04-03 06:59:24 SQL> SELECT CURRENT_TIMESTAMP FROM DUAL; --03-APR-22 07.01.50.391024 AM +08:00 SQL> SELECT DBTIMEZONE FROM DUAL; --+00:00 SQL> select SESSIONTIMEZONE from dual; --+08:00 SQL> SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', '3:00') FROM DUAL; --28-MAR-00 08.00.00.000000000 AM +03:00 SQL> SELECT SYSTIMESTAMP FROM DUAL; --03-APR-22 07.44.24.146176 AM +08:00 SQL> select LOCALTIMESTAMP from dual; --03-APR-22 07.15.28.945537 AM SQL> SELECT NEW_TIME(TO_DATE('11-10-09 01:23:45', 'MM-DD-YY HH24:MI:SS'), 'AST', 'PST') "New Date and Time" FROM DUAL; --2009-11-09 21:23:45 SQL> select NUMTODSINTERVAL(100, 'day') from dual; --+000000100 00:00:00.000000000 SQL> select NUMTOYMINTERVAL(1,'year') from dual; --+000000001-00 SQL> SELECT SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 11:30:00.00 -08:00') FROM DUAL; --28-MAR-00 07.30.00.000000000 PM SQL> SELECT TO_CHAR(TIMESTAMP '2009-01-01 00:00:00' + TO_DSINTERVAL('P100DT05H'), 'YYYY-MM-DD HH24:MI:SS') "Time Stamp" FROM DUAL; --2009-04-11 05:00:00 SQL> SELECT TO_TIMESTAMP ('10-Sep-02 14:10:10.123000', 'DD-Mon-RR HH24:MI:SS.FF') FROM DUAL; --10-SEP-02 02.10.10.123000000 PM SQL> SELECT TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00', 'YYYY-MM-DD HH:MI:SS TZH:TZM') FROM DUAL; --01-DEC-99 11.00.00.000000000 AM -08:00 SQL> select TO_YMINTERVAL('01-02')FROM DUAL; --+000000001-02 SQL> SELECT TZ_OFFSET('US/Eastern') FROM DUAL; ---04:00
函数 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
SYSDATE N 加括号 Y Y 加括号 Y
ADD_MONTHS N Y Y Y N Y
LAST_DAY N Y Y Y 只返回日期 Y
MONTHS_BETWEEN N 小数部分不准确 N N N Y
NEXT_DAY N Y Y Y N Y
EXTRACT (datetime) Y Y Y Y Y Y
ROUND (date) N Y N N 结果不一致 Y
TRUNC (date) N Y N Y N Y
TO_CHAR (datetime) N Y Y Y N Y
- - - - - - -
CURRENT_DATE 只返回日期 只返回日期 只返回日期 只返回日期 只返回日期 只返回日期
CURRENT_TIMESTAMP Y Y Y Y 不带时区 Y
DBTIMEZONE N 加括号 N N N 加括号
SESSIONTIMEZONE N 加括号 N N N 加括号
FROM_TZ N N N N N Y
SYSTIMESTAMP N N Y N N Y
LOCALTIMESTAMP Y Y Y Y Y Y
NEW_TIME N N N N N Y
NUMTODSINTERVAL N Y Y Y N Y
NUMTOYMINTERVAL N N N N N Y
SYS_EXTRACT_UTC N N N N N 结果不准确
TO_DSINTERVAL N N N N N Y
TO_TIMESTAMP Y Y Y Y N Y
TO_TIMESTAMP_TZ N N N N N Y
TO_YMINTERVAL N N N N N Y
TZ_OFFSET N N N N N N

转换函数

函数 说明
ASCIISTR -
BIN_TO_NUM -
CAST -
CHARTOROWID -
COMPOSE -
CONVERT -
DECOMPOSE -
HEXTORAW -
NUMTODSINTERVAL 同上
NUMTOYMINTERVAL 同上
TO_CHAR (character) -
TO_CHAR (datetime) 同上
TO_CHAR (number) -
TO_DATE -
TO_DSINTERVAL 同上
TO_MULTI_BYTE -
TO_NUMBER -
TO_SINGLE_BYTE -
TO_TIMESTAMP 同上
TO_TIMESTAMP_TZ 同上
TO_YMINTERVAL 同上
UNISTR -
RAWTOHEX -
RAWTONHEX -
ROWIDTOCHAR -
ROWIDTONCHAR -
SCN_TO_TIMESTAMP -
TIMESTAMP_TO_SCN -
TO_BINARY_DOUBLE -
TO_BINARY_FLOAT -
TO_BLOB -
TO_CLOB -
TO_LOB -
TO_NCHAR (character) -
TO_NCHAR (datetime) -
TO_NCHAR (number) -
TO_NCLOB -
TREAT -

上面各函数在 Oracle 中执行的例子

SQL> SELECT ASCIISTR('ABÄCDE') FROM DUAL; --AB\00C4CDE SQL> SELECT BIN_TO_NUM(1,0,1,0) FROM DUAL; --10 SQL> SELECT CAST('22-OCT-1997' AS TIMESTAMP) FROM DUAL; --22-OCT-97 12.00.00.000000 AM SQL> select CHARTOROWID('AAAFd1AAFAAAABSAA/') from dual; --AAAFd1AAFAAAABSAA/ SQL> SELECT COMPOSE( 'o' || UNISTR('\0308') ) from dual; --ö SQL> SELECT CONVERT('Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1') FROM DUAL; --A E I ? ? A B C D E ? postgres=# select convert('abc中国'::bytea, 'UTF8', 'GBK'); --\x616263d6d0b9fa SQL> select HEXTORAW('4041424344') FROM DUAL; --4041424344 SQL> SELECT TO_CHAR('01110') FROM DUAL; --01110 SQL> SELECT TO_CHAR('01110' + 1) FROM DUAL; --1111 SQL> select to_date('20190715','yyyymmdd') from dual; --2019-07-15 00:00:00 SQL> SELECT dump(TO_MULTI_BYTE( 'A')) FROM DUAL; --Typ=1 Len=2: 163,193 SQL> SELECT TO_NUMBER('1111') from dual; --1111 SQL> SELECT TO_SINGLE_BYTE('aaa') FROM DUAL; --aaa SQL> SELECT UNISTR('abc\00e5\00f1\00f6') FROM DUAL; --abcåñö
函数 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
ASCIISTR N N N N N N
BIN_TO_NUM N N N N N Y
CAST Y Y Y Y N Y
CHARTOROWID N N N N N N
COMPOSE N N N N N N
CONVERT Y Y Y Y Y Y
DECOMPOSE N N N N N N
HEXTORAW N N Y Y N N
TO_CHAR (character) N N Y Y N Y
TO_CHAR (number) N Y Y Y N Y
TO_DATE 只返回日期 Y Y Y N Y
TO_MULTI_BYTE N Y N N N Y
TO_NUMBER N Y Y Y N Y
TO_SINGLE_BYTE N Y N N N Y
UNISTR N Y N N N Y
RAWTOHEX - - - - - -
RAWTONHEX - - - - - -
ROWIDTOCHAR - - - - - -
ROWIDTONCHAR - - - - - -
SCN_TO_TIMESTAMP - - - - - -
TIMESTAMP_TO_SCN - - - - - -
TO_BINARY_DOUBLE - - - - - -
TO_BINARY_FLOAT - - - - - -
TO_BLOB - - - - - -
TO_CLOB - - - - - -
TO_LOB - - - - - -
TO_NCHAR (character) - - - - - -
TO_NCHAR (datetime) - - - - - -
TO_NCHAR (number) - - - - - -
TO_NCLOB - - - - - -
TREAT - - - - - -

聚合函数

函数 说明
LISTAGG -
VM_CONCAT -
MEDIAN -

上面各函数在 Oracle 中执行的例子

drop table tt CASCADE; create table tt (col1 int,col3 char); insert into tt values (1001,'1'); insert into tt values (2001,'2'); insert into tt values (3001,'3'); insert into tt values (4001,'4'); SQL> SELECT LISTAGG(col1,':') WITHIN GROUP (ORDER BY col1) from tt; LISTAGG(COL1,':')WITHINGROUP(ORDERBYCOL1) -------------------------------------------------------------------------------- 1001:1002:2002:3001 SQL> SELECT wm_concat(col3) from tt; WM_CONCAT(COL3) --------------------------------------------------------------------------------- 1,2,3,4 SQL> select MEDIAN(col1) from tt; MEDIAN(COL1) ------------ 2501
函数 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
LISTAGG N 显式转换 Y Y N 显式转换
MEDIAN N Y Y Y N Y
VM_CONCAT Y Y N N N Y
  • VM_CONCAT 在 PostgreSQL 和 IvorySQL 中只能转换字符类型,不能转换数值类型。
  • VM_CONCAT 在 Oracle 用的比较多,openGauss 系列的数据库不支持的话,可以使用下面的方式手工创建这个函数
CREATE OR REPLACE FUNCTION vm_concat_state_func (results text, val text) RETURNS text LANGUAGE sql COST 50 IMMUTABLE AS $$ select results || ',' ||val; $$; CREATE OR REPLACE FUNCTION vm_concat_final_func (results text) RETURNS text LANGUAGE sql COST 111 IMMUTABLE AS $$ select substr(results, 2); $$; CREATE AGGREGATE wm_concat(text) ( sfunc = vm_concat_state_func, stype = text, initcond = '', FINALFUNC = vm_concat_final_func );

General Comparison Functions

函数 说明
GREATEST -
LEAST -

上面各函数在 Oracle 中执行的例子

SQL> SELECT GREATEST('HARRY', 'HARRIOT', 'HAROLD') "Greatest" FROM DUAL; --HARRY SQL> SELECT GREATEST(1, 3.925, 2.4) "Greatest" FROM DUAL; --3.925 SQL> SELECT LEAST('HARRY', 'HARRIOT', 'HAROLD') "Greatest" FROM DUAL; --HAROLD SQL> SELECT LEAST(1, 3.925, 2.4) "Greatest" FROM DUAL; --1
函数 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
GREATEST Y Y Y Y Y Y
LEAST Y Y Y Y Y Y

Encoding and Decoding Functions

函数 说明
DECODE -
DUMP -
ORA_HASH -
VSIZE -

上面各函数在 Oracle 中执行的例子

drop table tt; create table tt (col1 int,col3 int); insert into tt values (1001,1),(2001,2),(3001,3),(4001,4); SELECT col1, DECODE(col3, 1, 'one', 2, 'two', 3, 'three', 'other number') "num-word" FROM tt; col1 | num-word ------+-------------- 1001 | one 2001 | two 3001 | three 4001 | other number SQL> SELECT DUMP('abc') from dual; --Typ=96 Len=3: 97,98,99 SQL> SELECT VSIZE('abc') from dual; --3
函数 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
DECODE N Y Y Y N Y
DUMP N Y N N N Y
ORA_HASH - - - - - -
VSIZE N N N N N Y

NULL-Related Functions

函数 说明
COALESCE -
LNNVL -
NANVL 同上
NULLIF -
NVL -
NVL2 -

上面各函数在 Oracle 中执行的例子

drop table tt; create table tt (col1 int,col3 int); insert into tt values (1002,2000); insert into tt values (2002,null); SQL> select * from tt; COL1 COL3 ---------- ---------- 1002 2000 2002 SQL> SELECT col1,col3 FROM tt WHERE LNNVL( col3 > 2000 ); COL1 COL3 ---------- ---------- 1002 2000 2002 SQL> SELECT col1,NULLIF(col3,col1) FROM tt; COL1 NULLIF(COL3,COL1) ---------- ----------------- 1002 2000 2002 SQL> SELECT col1, NVL(col3,0) "nvl" FROM tt; COL1 nvl ---------- ---------- 1002 2000 2002 0 SQL> SELECT col1, NVL2(col3,'IS NOT NULL','IS NULL') FROM tt; COL1 NVL2(COL3,' ---------- ----------- 1002 IS NOT NULL 2002 IS NULL SQL> SELECT col1, NVL2(col3,0,1) FROM tt; COL1 NVL2(COL3,0,1) ---------- -------------- 1002 0 2002 1
函数 PGSQL 13.3 orafce 3.19 OG 2.1 OG 3.0 mysql 8.0 IvorySQL 1.2
COALESCE - - - - - -
LNNVL N Y N N N Y
NULLIF Y Y Y Y Y Y
NVL N Y Y Y N Y
NVL2 N Y N N N Y

Oracle 的其他函数

https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions002.htm#SQLRF20034

最后修改时间:2022-04-10 10:05:14
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论