Oracle-常用通用函数、条件判断函数和多行函数

Oracle-常用通用函数、条件判断函数和多行函数

本文中用到的表:
这里写图片描述

通用函数

通用函数就是可以作用于任何类型的函数(参数类型可以是number或varchar2或date类型)

1)NVL(a,b)
如果a为null值,则取b为返回结果,否则返回a。

2)NVL2(a,b,c)
如果a为null, 则结果为b, 否则结果为c。

3)NULLIF(a,b)
在类型一致的情况下,如果a与b相同,返回NULL,否则返回a。
例如:比较10和10.0是否相同
select NULLIF(10,’10’) from dual; ->错误, 类型不一致

条件判断函数

1)case表达式
case表达式是SQL99标准。一个CASE表达式的默认返回值类型是任何返回值的相容集合类型,但具体情况视其所在语境而定。
如果用在字符串语境中,则返回结果味字符串。如果用在数字语境中,则返回结果为十进制值、实值或整数值。

语法1:
SELECT
case 字段
when 条件1 then 表达式1
when 条件2 then 表达式2
else 表达式n
end

语法2:
SELECT
CASE
WHEN 条件 THEN 表达式1 ELSE 表达式2 END;

范例:
SELECT CASE 1 WHEN 1 THEN ‘one’
WHEN 2 THEN ‘two’ ELSE ‘more’ END; -> 结果为“one”

SELECT CASE WHEN 1>0 THEN ‘true’ ELSE ‘false’ END; -> ‘true’

具体范例: 查询emp表,将职位是分析员的,工资+1000;职位是经理的,工资+800;职位是其它的,工资+400
select ename “姓名”,job “职位”,sal “涨前工资”,
case job
when ‘ANALYST’ then sal+1000
when ‘MANAGER’ then sal+800
else sal+400
end “涨后工资”
from emp;
T1

2)decode()函数
decode()函数是专属oracle的语法
语法:
decode(字段,条件1,表达式1,条件2,表达式2,…表达式n)

还是上面那个问题, 现在利用decode()函数来解决:
select ename “姓名”,job “职位”,sal “涨前工资”,
decode(job,’ANALYST’,sal+1000,’MANAGER’,sal+800,sal+400) “涨后工资”
from emp;
结果相同。

多行函数

多行函数:输入多个参数,或者是内部扫描多次,输出一个结果,例如:count(*)->(count在计算结果时,扫描了14次呢)
并且注意的是, 在oracle中,多行函数是不会统计null值的。

1)count

范例1:
统计emp表中员工总人数
select count(*) from emp;
*号适用于表字段较少的情况下,如果字段较多,扫描多间多,效率低,项目中提倡使用某一个非null唯一的字段,通常是主键

范例2:
统计公司有多少个不重复的部门
select count(distinct deptno) from emp;

2)max和min
想法和count一样,所以他们也是多行函数啊。

范例1:
查询员工表中最高工资,最低工资
select max(sal) “最高工资”,min(sal) “最低工资”
from emp;

入职最早,入职最晚员工
select max(hiredate) “最晚入职时间”,min(hiredate) “最早入职时间”
from emp;

3)sum和avg

范例1:
按部门求出该部门平均工资,且平均工资取整数,采用截断
select deptno “部门编号”,trunc(avg(sal),0) “部门平均工资”
from emp
group by deptno;

(继续)查询部门平均工资大于2000元的部门
select deptno “部门编号”,trunc(avg(sal),0) “部门平均工资”
from emp
group by deptno
having trunc(avg(sal),0) > 2000;

单引号与双引号出现的地方

单引号出现的地方如下:
1)字符串,例如:’hello’
2)日期型,例如:’17-12月-80’
3)to_char/to_date(日期,’YYYY-MM-DD HH24:MI:SS’)

双引号出现的地方如下:
1)列别名,例如:select ename “姓 名” from emp
2)to_char/to_date(日期,’YYYY”年”MM”月”DD”日” HH24:MI:SS’)‘’号中的英文字符大小写不敏感

<think>嗯,用户想了解在MyBatis的foreach标签中使用聚合函数的示例教程。首先,我需要回忆一下MyBatis的基本知识,特别是动态SQL部分。foreach标签通常用于循环遍历集合,生成重复的SQL片段,比如IN条件或者批量插入。 但是用户提到的是结合聚合函数使用,这可能需要将foreach生成的多个结果作为聚合函数的输入。比如,可能是在SELECT语句中使用XMLAGG或者GROUP_CONCAT这类函数,将多个值拼接成一个字符串。这时候,foreach可能用来动态生成需要聚合的字段或条件。 接下来,我需要查看用户提供的引用内容。引用[2]提到了XMLAGG函数,它是一个聚合函数,用于连接字符串值。这可能与用户的问题相关。用户可能希望在使用foreach动态生成某些列或条件后,用XMLAGG来聚合结果。 另外,用户的问题涉及到MyBatis的foreach标签聚合函数的结合使用,可能需要考虑如何在动态SQL中嵌套使用这些函数。例如,在SELECT语句中,动态生成多个列,然后使用XMLAGG来聚合这些列的值。 可能的示例场景是:用户有一个字段列表,需要根据不同条件动态选择这些字段,并将它们的值聚合成一个字符串。比如,根据传入的字段列表,生成多个字段的拼接结果。 需要注意的是,MyBatis的foreach标签通常用于生成类似IN (item1, item2, ...)的结构,或者批量插入的VALUES。但结合聚合函数可能需要不同的结构,比如在SELECT子句中使用foreach生成多个字段,然后应用聚合函数。 例如,假设需要将多个字段的值用逗号连接,可以使用XMLAGG或者数据库特定的函数如MySQL的GROUP_CONCAT。这时,foreach可能用来循环这些字段名,并将它们作为参数传递给聚合函数。 可能的步骤是: 1. 在Mapper接口中定义方法,参数包含需要聚合的字段列表。 2. 在XML映射文件中,使用foreach标签遍历字段列表,生成每个字段的表达式。 3. 将这些动态生成的字段表达式作为聚合函数的参数,比如XMLAGG。 4. 处理结果,返回聚合后的字符串。 同时,需要注意不同数据库对聚合函数的支持情况,比如Oracle的XMLAGG,MySQL的GROUP_CONCAT,或者SQL Server的STRING_AGG。可能需要根据数据库类型调整函数名称语法。 此外,用户提供的引用[2]中的XMLAGG示例可能需要使用DISTINCT或ALL关键字,以及如何处理结果中的分隔符。例如,XMLAGG默认可能不带分隔符,需要手动添加逗号,或者使用数据库特定的方法,如Oracle的LISTAGG。 另一个考虑是,在MyBatis的动态SQL中,如何正确拼接这些字段到聚合函数中。可能需要使用<foreach>标签的item、separator等属性来生成正确的SQL片段。 例如,假设字段列表是['name', 'age', 'email'],需要生成类似XMLAGG(name || ', ' || age || ', ' || email)的结构。或者使用GROUP_CONCAT(CONCAT(name, age, email SEPARATOR ', '))。 但具体实现可能需要根据不同的数据库进调整,因此示例可能需要说明数据库类型,或者提供通用的方法。 总结,用户需要的是一个在MyBatis的foreach标签中动态生成聚合函数参数的示例,可能涉及XMLAGG或其他聚合函数,结合动态字段列表。需要确保生成的SQL语法正确,并处理字段之间的分隔符。</think>### MyBatis foreach标签中使用聚合函数示例教程 在MyBatis中结合`foreach`标签与聚合函数(如`XMLAGG`或`GROUP_CONCAT`)可实现动态字段聚合。以下是分步实现方法: --- #### 一、应用场景 假设需要根据前端传入的字段列表,动态生成多个字段值的聚合字符串(如`"张三-25,李四-30"`)。以Oracle数据库的`XMLAGG`函数为例[^2]。 --- #### 二、Mapper接口定义 ```java public interface UserMapper { String getAggregatedData(@Param("fields") List<String> fields); } ``` --- #### 三、XML映射文件配置 ```xml <select id="getAggregatedData" resultType="java.lang.String"> SELECT RTRIM( XMLAGG( XMLELEMENT( e, CONCAT( <!-- 动态生成字段组合 --> <foreach collection="fields" item="field" separator=" || '-' || "> ${field} </foreach> , ', ' ) ) ORDER BY id ).EXTRACT('//text()').GETSTRINGVAL() , ',') AS aggregated_result FROM users </select> ``` --- #### 四、关键解析 1. **`foreach`动态拼接字段** - `collection="fields"`:接收Java传入的`List<String>`参数 - `item="field"`:循环变量代表每个字段名 - `separator=" || '-' || "`:生成类似`name || '-' || age`的表达式 2. **聚合函数处理** - 使用`XMLAGG(XMLELEMENT(...))`将多行数据合并为单个字符串 - `RTRIM(..., ',')`用于移除末尾多余的分隔符 3. **结果示例** 若传入`fields = ["name", "age"]`,生成的SQL为: ```sql XMLAGG(XMLELEMENT(e, CONCAT(name || '-' || age, ', '))) ``` --- #### 五、不同数据库适配建议 | 数据库类型 | 聚合函数示例 | 特点说明 | |--------------|---------------------------------------|------------------------------| | MySQL | `GROUP_CONCAT(CONCAT_WS('-',name,age))` | 需指定分隔符 | | SQL Server | `STRING_AGG(CONCAT(name,'-',age), ',')` | 直接支持分隔符参数 | | PostgreSQL | `STRING_AGG(name || '-' || age, ',')` | 使用`||`运算符拼接字段 | --- #### 六、注意事项 1. **SQL注入风险** 避免直接使用`${field}`,应在业务层校验字段合法性。若字段名不可控,改用`<choose>`条件判断。 2. **性能优化** 大量数据聚合时,建议添加`WHERE`条件限制数据集范围,或使用分页查询。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值