package jef.database.query; import jef.database.DbFunction; /** * 标准函数 * * <p> * 什么是标准函数。 * 即框架整理出来的,支持跨数据库的通用函数。使用这些通用函数可以实现数据库无关的编程。 * 这里只列举绝大部分数据库都能支持的函数 * 科学计算类的函数位于{@link jef.database.query.Scientific} * * @see jef.database.query.Scientific */ public enum Func implements DbFunction{ //数值计算 /** * 取模(求余)运算 * mod(integer_type, integer_type) returns the remainder (modulus) of arg1/arg2 */ mod, /** * 获取绝对值 */ abs, /** * 正数返回1,负数返回-1,零返回0 */ sign, /** * 按大数取整 */ ceil, /** * 按小数取整 */ floor, /** * 四舍五入取整 */ round, //条件计算 /** * 可以在括号中写多个参数,返回参数中第一个非null值 */ coalesce, //n 第一个非空值,变参 /** * 双参数,nullif ( L, R ) * 相等返回null,否则返回第一个参数值 */ nullif, /** * 双参数,如果两个参数相等返回null,否则返回参数1。(WHEN arg1=arg2 THEN NULL ELSE arg1 END) */ nvl, /** * 类似于多个if分支。(参照Oracle) * select decode('abc','a',1,'b',2,'abc',3,4) E3,decode('abc','a',1,'b',2,4) E4 from dual --应该返回3和4 */ decode, //条件分支(类似于 MYSQL中的IF) //字符串处理 /** * 连接多个字符串,虽然大部分数据库都用 || 表示两个字符串拼接,但是MYSQL是必须用concat函数的 */ concat, /** * 三参数,查找并替换字符 * replace(sourceStr, searchStr, replacement) */ replace, /** * 针对单个字符的批量查找替换.(参照Oracle) * <pre><code> * translate('abcde','ac','12') = '1b2de' * </code></pre> */ translate, //字符替换 /** * 取字符的子串 (第一个字符串序号为1)<br> * substring(source, startIndex, length) * <pre><code>substring('abcde',2,3)='bcd' * </code></pre> */ substring, /** * 截去字符串两头的空格 */ trim, /** * 截去字符串右边的空格 */ rtrim, /** * 截去字符串左边的空格 */ ltrim, /** * 字符串转小写 */ lower, /** * 字符串转大写 */ upper, /** * 在字符串或数字左侧添加字符,拼到指定的长度。 lpad(source, length, paddingStr) * <pre><code>lpad('abc', 7, '1') = '1111abc'</code></pre> */ lpad, /** * 在字符串或数字右侧添加字符,拼到指定的长度。 lpad(source, length, paddingStr) * <pre><code>rpad('abc', 7, '1') = 'abc1111'</code></pre> */ rpad, /** * 文字长度计算。无论中西文字符,都按1个字符计算。来自大部分数据库。顺便一提,这个函数在MYSQL上的对应是char_length(),不是length(). */ length, /** * 文字长度按实际存储大小计算,因此在UTF8编码的数据库中,汉字实际占3个字符。在GBK编码中,汉字占两个字符。 * (参考oracle函数lengthb) */ lengthb, /** * 对于<strong>数字</strong>,保留其小数点后的指定位数。 * <pre><code> * trunc(123.456)=123 * trunc(123.456,2)=123.45 * trunc(123.456,-1)=120 * * 在Oracle中,trunc还能起到将日期时间截为仅日期部分。目前并未在其他数据库上模拟这部分功能。因此要确保你的程序 * 能在所有数据库上正常运行,<strong>请使用{@link #date}功能来截取日期。</strong> * 对于其他类型的数据库,类型转换到date都会自然的截断时分秒 * * </code></pre> */ trunc, /** * 双参数,在参数2中查找参数1,返回匹配的序号(序号从1开始)。(类似Java的indexOf,区别是参数相反) * TODO 支持三参数,第三个参数可以描述从指定序号的字符串开始查找 */ locate, //统计计算 /** * 返回分组中数据的平均值 */ avg, /** * 返回分组中的数据的总和 */ sum, /** * 返回分组中的最大值 */ max, /** * 返回分组中的最小值 */ min, /** * 计算行数 */ count, /** * 返回当前时间(不含日期) */ current_time, /** * 返回当前日期 */ current_date, /** * 返回当前时间戳 */ current_timestamp, /** * 和CURRENT_TIMESTAMP是同义词 * 注意,如果在SQL中书写,必须要写成 now(),括号不能省。 */ now, //日期时间处理函数 /** * 获得年 */ year, /** * 获得月 */ month, /** * 获得日 */ day, /** * 获得时 */ hour, /** * 获得分 */ minute, /** * 获得秒 */ second, /** * 截取年月日 */ date, /** * 截取时分秒 */ time, /** * 返回第一个日期减去第二个日期的天数。(不足一天不计算) */ datediff, /** * 时间差多少,单位需要指定,第一个参数为单位取值范围是{@link jef.database.support.SQL_TSI}的枚举,后两个参数是日期1和日期2,返回日期2减去日期1(注意和datediff刚好相反) * (JDBC标准函数) */ timestampdiff, /** * 时间调整 * <ul> * <li>第一个参数是时间调整单位。参见{@link jef.database.support.SQL_TSI} * (MYSQL原生实现了timestampadd,timestampdiff两个函数,并且允许时间单位简写,但如果你写作 SQL_TSI_DAY MYSQL也能识别。)</li> * <li>第二个参数是整形表达式,表示调整的数值(正数+,负数-)</li> * <li>第三个参数是时间timestamp表达式</li> * </ul> * ( JDBC标准函数) */ timestampadd, /** * 在日期上增加天数 adddate(current_date, 1)即返回明天<br> * (来自于MYSQL,DATE_ADD与之同义) */ adddate,//DATE_ADD和它是同义词 /** * 在日期上减去天数 * (来自于MYSQL,DATE_SUB与之同义) */ subdate, /** * 在日期上增加月数 * (参照Oracle的add_month函数) */ add_months, /** * 类型转换函数,格式为 cast(arg as varchar) cast(arg as timestamp)等等 */ cast, /** * 框架的统一函数,转为字符串类型 * (来自hibernate HQL) */ str, //JPA规定的通用函数,第一个参数作为数据库的函数名,后面的参数作为数据库函数的参数 //FUNC }