1 |
IF() |
支持 |
- expr1入参仅支持bool类型。非bool类型入参若不能转换为bool类型则报错。
- 若expr2、expr3两入参类型不同且两类型间不存在隐式转换函数则报错。
- 两入参类型相同时,返回该入参类型。
- 若expr2、expr3两入参类型分别为NUMERIC、STRING或TIME其中一个时,输出为TEXT类型,MySQL输出为VARCHAR类型。
|
2 |
IFNULL() |
支持 |
- 若expr1、expr2两入参类型不同且两类型间不存在隐式转换函数则报错。
- 两入参类型相同时,返回该入参类型。
- 若expr1、expr2两入参类型范畴分别为NUMEIRC、STRING或TIME其中一个时,输出为TEXT类型,MySQL输出为VARCHAR类型。
- 两入参类型其中一个为FLOAT4类型另一个为numeric范畴中任一类型,返回值为DOUBLE类型。MySQL其中一入参为FLOAT4,另一入参为TINYINT、UNSIGNED TINYINT、SMALLINT、UNSIGNED SMALLINT、MEDIUMINT、UNSIGNED MEDIUMINT、BOOL任一类型时,返回FLOAT4类型,第一个入参为FLOAT4,第二个入参为BIGINT或UNSIGNED BIGINT时,返回FLOAT类型。
|
3 |
NULLIF() |
支持 |
- GaussDB中NULLIF()类型推导遵从以下逻辑:
- 如果两个参数的数据类型不同,且两入参类型存在等值比较操作符,则返回对应等值操作符对应的左值类型,否则会对两入参类型进行强制类型兼容。
- 若强制类型兼容后,存在等值比较操作符,则返回强制类型兼容后对应等值操作符的左值类型。
- 若强制类型兼容后,仍找不到对应等值操作符,则报错。
--两入参类型存在等值比较操作符
gaussdb=# select pg_typeof(nullif(1::int2, 2::int8));
pg_typeof
-----------
smallint
(1 row)
--两入参类型不存在等值比较操作符,但在强制类型兼容后可以找到等值比较操作符
gaussdb=# select pg_typeof(nullif(1::int1, 2::int2));
pg_typeof
-----------
bigint
(1 row)
--两入参类型不存在等值比较操作符,且强制类型兼容后也不存在等值比较操作符
gaussdb=# SELECT nullif(1::bit, '1'::MONEY);
ERROR: operator does not exist: bit = money
LINE 1: SELECT nullif(1::bit, '1'::MONEY);
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
CONTEXT: referenced column: nullif
- MySQL输出类型仅与第一个入参类型有关:
- 第一个入参为tinyint、smallint、mediumint、int、bool时,输出为int类型。
- 第一个入参为bigint时,输出为bigint类型。
- 第一个入参为unsigned tinyint、unsigned smallint、unsigned mediumint、unsigned int、bit时,输出为unsigned int类型。
- 第一个入参为unsigned bigint时,输出为unsigned bigint。
- 第一个入参为浮点型即float、double、real时,输出为double类型。
- 第一个入参类型为decimal或numeric类型时,输出为decimal类型。
- 第一个入参类型为时间类型或字符串类型即date、time、date、datetime、timestamp、char、varchar以及tinytext、enum、set时,输出为varchar类型。
- 第一个入参类型为text、mediumtext、longtext时,输出为longtext类型。
- 第一个入参类型为tinyblob时,输出为varbinary类型。
- 第一个入参类型为mediumblob或longblob时,输出为longblob类型。
- 第一个入参为blob时,输出为blob类型。
|
4 |
ISNULL() |
支持 |
GaussDB中返回值为BOOLEAN类型的t或f,MySQL中返回值为INT类型的1或0。 |