更新时间:2025-09-09 GMT+08:00
分享

流量控制函数

表1 流量控制函数列表

MySQL数据库

GaussDB数据库

差异

IF()

支持,存在差异

  • expr1入参仅支持BOOL类型。非BOOL类型入参若不能转换为bool类型则报错。
  • 若expr2、expr3两个入参类型不同且两类型间不存在隐式转换函数则报错。
  • 两个入参类型相同时,返回该入参类型。
  • 若expr2、expr3两个入参类型分别为NUMERIC、STRING或TIME其中一个,GaussDB输出为TEXT类型,MySQL输出为VARCHAR类型。

IFNULL()

支持,存在差异

  • 若expr1、expr2两个入参类型不同且两类型间不存在隐式转换函数则报错。
  • 两个入参类型相同时,返回该入参类型。
  • 若expr1、expr2两个入参类型范畴分别为NUMERIC、STRING或TIME其中一个,GaussDB输出为TEXT类型,MySQL输出为VARCHAR类型。
  • 两个入参类型第一个入参为FLOAT4,另一个为BIGINT或UNSIGNED BIGINT时返回DOUBLE类型,MySQL返回FLOAT类型。

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类型。

ISNULL()

支持,存在差异

GaussDB中返回值为BOOLEAN类型的t或f,MySQL中返回值为INT类型的1或0。

相关文档