Skip to content

内置SQL函数

huiche只负责函数转译,部分函数在不同数据库实际行为可能存在差异,支持的函数有限,只有常见的, 如果需要,你可以自定义,参考自定义SQL

说明

  • {}代表参数占位符, 如无特殊说明的情况下, 一个{}代表一个参数,仅部分函数会有说明,{}可能为可变参数,动态适配
  • huiche的SQL函数本质上就是Expression,不过根据实际函数,部分函数会返回为Condition(可以认为是布尔表达式)

ABS()绝对值

Sql.abs()调用,实际SQL为ABS({}), 所有方言均支持

ANY_VALUE()任一值

Sql.anyValue()调用

DB2,MariaDB,SQLite,SQLServer 不支持,实际使用MIN({}) 模拟

其他数据库 SQL为ANY_VALUE({})

AVG()平均值

Sql.avg()调用,实际SQL为AVG({}), 所有方言均支持

CEILING()向上取整

Sql.ceiling()调用

Oracle 实际SQL为CEIL({})`

其他数据库 实际SQL为CEILING({})

CHAR_LENGTH()字符长度

Sql.charLength()调用

说明

  • Oracle,SQLite 实际SQL为LENGTH({})
  • SQLServer 实际SQL为LEN({})
  • 其他数据库 SQL为CHAR_LENGTH({})

WARNING

注意 所有数据库行为可能根据编码等结果不一致

COALESCE()空值替换

Sql.coalesce()调用,实际SQL为COALESCE({}), 所有方言均支持

CONCAT()字符串拼接

Sql.concat()调用,实际SQL为CONCAT({}), 所有方言均支持

其中{}为可变参数,可传入多个,但部分数据库受限,比如Oracle只支持2个参数

COUNT()计数

Sql.count()调用,实际SQL为COUNT({})/COUNT(*)/COUNT(DISTINCT {}), 所有方言均支持

FLOOR()向下取整

Sql.floor()调用,实际SQL为FLOOR({}), 所有方言均支持

JSON_EXISTS()JSON路径存在判断

Sql.jsonExists()调用,path为$开头的形式

说明

  • MySQL 实际SQL为JSON_CONTAINS_PATH({}, 'one', {})
  • SQLServer 实际SQL为JSON_PATH_EXISTS({}, {}) = 1
  • SQLite 实际SQL为JSON_EXTRACT({}, {}) IS NOT NULL
  • H2,HSQL 不支持
  • 其他数据库 实际SQL为JSON_EXISTS({},{})

JSON_VALUE()JSON路径取值

Sql.jsonValue()调用,path为$开头的形式

说明

  • SQLite 实际SQL为JSON_EXTRACT({},{})
  • H2,HSQL 不支持
  • 其他数据库 实际SQL为JSON_VALUE({},{})

LOWER()小写

Sql.lower()调用,实际SQL为LOWER({}), 所有方言均支持

MAX()最大值

Sql.max()调用,实际SQL为MAX({}), 所有方言均支持

MIN()最小值

Sql.min()调用,实际SQL为MIN({}), 所有方言均支持

MOD() 取余

Sql.mod()调用

SQLServer 不支持,通过取余操作符({} % {}) 模拟, 因为本身是作为函数,优先级高,所以添加了()

其他数据库 SQL为MOD({})

NULLIF()等值置空

Sql.nullIf()调用,实际SQL为NULLIF({},{}), 所有方言均支持

OCTET_LENGTH()字节长度

Sql.octetLength()调用

说明

  • Oracle 实际SQL为LENGTHB({})
  • SQLServer 实际SQL为DATALENGTH({})
  • 其他数据库 SQL为OCTET_LENGTH({})

注意 所有数据库行为可能根据编码,校对规则等结果不一致

POSITION()获取子串下标

Sql.position()调用

说明

  • Oracle,SQLite 实际SQL为INSTR({}, {}),已适配参数顺序
  • SQLServer 实际SQL为CHARINDEX({},{})
  • 其他数据库 SQL为POSITION({} IN {})

REGEXP_LIKE()正则匹配

Sql.regexpLike()调用

说明

  • MariaDB 不支持此函数,使用操作符替代,实际SQL为({} REGEXP {}),为了保证执行顺序一致,添加了()
  • SQLite 不支持
  • 其他数据库 实际SQL为REGEXP_LIKE({}, {})

不同数据库实际对正则支持可能存在差异

REPLACE()替换字符串

Sql.replace()调用,实际SQL为REPLACE({}, {}, {}), 所有方言均支持

ROUND()四舍五入

Sql.round()调用,实际SQL为ROUND({}), 所有方言均支持

ROW()行构造器

Sql.row()调用

说明

  • DB2,DM,Oracle,SQLite 实际SQL为({})
  • SQLServer 不支持
  • 其他数据库 SQL为ROW({})
  • 所有数据库{}均为可变参数,可传入多个,自动适配

STRING_AGG()字符串聚合

Sql.stringAgg()调用

说明

  • DB2,DM,Oracle 实际SQL为LISTAGG({}, {})
  • MySQL 实际SQL为GROUP_CONCAT({} SEPARATOR {})
  • 其他数据库 SQL为STRING_AGG({}, {})

STRING_AGG_DISTINCT()字符串去重聚合

Sql.stringAggDistinct()调用

说明

  • DB2,DM,Oracle 实际SQL为LISTAGG(DISTINCT {}, {})
  • MySQL 实际SQL为GROUP_CONCAT(DISTINCT {} SEPARATOR {})
  • Oracle,SQLServer,HSQL,SQLite 不支持
  • 其他数据库 SQL为STRING_AGG(DISTINCT {}, {})

SUBSTRING()分割字符串

Sql.substring()调用

Oracle 实际SQL为SUBSTR({}, {}, {})

其他数据库 SQL为SUBSTRING({}, {}, {})

SUM()求和

Sql.sum()调用,实际SQL为SUM({}), 所有方言均支持

TRIM()去两端空白字符

Sql.trim()调用,实际SQL为TRIM({}), 所有方言均支持

UPPER()大写

Sql.upper()调用,实际SQL为UPPER({}), 所有方言均支持

()括号包裹

Sql.paren()调用,实际SQL为({}), 所有方言均支持