case when 的运用,rownum=1 的用法

本文详细解析了SQL中的Case When语句及其在两值比较中的应用,并深入探讨了Rownum在数据检索中的特殊作用及限制,如查找特定位置的数据行及在大数据集中的性能影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:

(case when a >= b   then   1   else   0   end )

(如果   A > B  则等于1  要不等于0  结束)多用于两个值的比较

2:

rownum=1 的用法:后面的值只可以小于rownum,不可以大于,大于是查不出数据的

如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)

查询rownum在某区间的数据,必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。

org.springframework.dao.DataIntegrityViolationException: ### Error querying database. Cause: java.sql.SQLIntegrityConstraintViolationException: (conn=1968867) ORA-01427: single-row subquery returns more than one row ### The error may exist in file [D:\workfiles\YH\yh\04.Implement\middlplatform\lrs-platform\lrs-platform-service\lrs-platform-service-concert\target\classes\mapper\read\Bbw3ReadMapper.xml] ### The error may involve org.mohrss.lrs.lr.concert.mapper.read.Bbw3ReadMapper.queryMonthOrQuaryList-Inline ### The error occurred while setting parameters ### SQL: select ABBW30, BGZ711, AAE001, ABB9M1, ABB9M2, ABB9M3, AAB301, AAB004, ABB9MB, AAE030, AAE031, ABB9M4, ABB9M5, ABB9M6, AAE004, AAE005, BGC701, ABB9M7, ABB9M8, to_char(to_date(ABB9M9,'yyyyMMdd'),'yyyy-MM-dd') as abb9m9, ABB9M9 as abb9m9back, ABB9MA, AAE100, AAE013, AAE400, AAE011, BAE295, AAE017, AAE504, AAE036, (select aba429 from ba44 a where a.aba414 = b.abbw30 and aba428 != 'mp4' and rownum = 1) as aba429, (select aba432 from ba44 a where a.aba414 = b.abbw30 and aba428 != 'mp4' and rownum = 1) as aba432, (select aae707 from ba44 a where a.aba414 = b.abbw30 and aba428 != 'mp4' and rownum = 1) as aae707, (select aba429 from ba44 a where a.aba414 = b.abbw30 and aba428 != 'mp4' ) as fileName1List, (select aba432 from ba44 a where a.aba414 = b.abbw30 and aba428 != 'mp4' ) as fileUrlList, (select aae707 from ba44 a where a.aba414 = b.abbw30 and aba428 != 'mp4' ) as fileId1List, (select aba429 from ba44 a where a.aba414 = b.abbw30 and aba428 = 'mp4' and rownum = 1) as videoName, (select aae707 from ba44 a where a.aba414 = b.abbw30 and aba428 = 'mp4' and rownum = 1) as videoId, case WHEN CEIL(to_date(ABB9M9,'yyyyMMdd') - SYSDATE) > 30 THEN 0 else 1 end as isSubmit from BBW3 b where bgz711 = ? and aab301 = ? ### Cause: java.sql.SQLIntegrityConstraintViolationException: (conn=1968867) ORA-01427: single-row subquery returns more than one row怎么解决?我希望能直接通过子查询获取文件列表存在java数组中
03-28
SELECT t1.F_DaTag, CASE WHEN q1_lower.F_AvgData IS NOT NULL AND q1_upper.F_AvgData IS NOT NULL THEN (q1_lower.F_AvgData + (q1_pos.q1_position - FLOOR(q1_pos.q1_position)) * (q1_upper.F_AvgData - q1_lower.F_AvgData)) * 2 ELSE NULL END AS daily_value FROM (SELECT DISTINCT F_DaTag FROM t_houraggregation) t1 LEFT JOIN ( -- 计算每个F_DaTag的数据量和Q1位置 SELECT F_DaTag, COUNT(*) AS total_count, (COUNT(*) + 1) * 0.25 AS q1_position FROM t_houraggregation WHERE F_DataDate BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY) AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) GROUP BY F_DaTag ) q1_pos ON t1.F_DaTag = q1_pos.F_DaTag LEFT JOIN ( -- 获取Q1下限值(floor(q1_position)) SELECT t2.F_DaTag, t2.F_AvgData, @rownum := IF(@prev = t2.F_DaTag, @rownum + 1, 1) AS row_num, @prev := t2.F_DaTag FROM t_houraggregation t2 JOIN (SELECT @rownum := 0, @prev := '') r WHERE t2.F_DataDate BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY) AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) ORDER BY t2.F_DaTag, t2.F_AvgData ) q1_lower ON t1.F_DaTag = q1_lower.F_DaTag AND q1_lower.row_num = FLOOR(q1_pos.q1_position) LEFT JOIN ( -- 获取Q1上限值(ceil(q1_position)) SELECT t2.F_DaTag, t2.F_AvgData, @rownum := IF(@prev = t2.F_DaTag, @rownum + 1, 1) AS row_num, @prev := t2.F_DaTag FROM t_houraggregation t2 JOIN (SELECT @rownum := 0, @prev := '') r WHERE t2.F_DataDate BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY) AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) ORDER BY t2.F_DaTag, t2.F_AvgData ) q1_upper ON t1.F_DaTag = q1_upper.F_DaTag AND q1_upper.row_num = CEIL(q1_pos.q1_position);
最新发布
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值