求助:HackerRank SQL进阶题三角形类型判断语句错误排查
三角形类型判断SQL语句的错误分析
需求说明
根据TRIANGLES表中每条记录的三条边长(A、B、C),判断并输出对应的三角形类型,结果只能是以下四种之一:
- Equilateral(等边三角形):三条边长完全相等
- Isosceles(等腰三角形):恰好有两条边长相等
- Scalene(不等边三角形):三条边长均不相等且能构成三角形
- Not A Triangle(非三角形):三边无法满足三角形构成条件(任意两边之和不大于第三边)
待分析的错误SQL语句
select if(a=b=c,'Equilateral', (select if(a=b or b=c or c=a,'Isosceles', select if( a+b Triangle','Scalene')))) from triangles;
存在的错误点
- 连续等号语法错误:SQL不支持
a=b=c这种连续判断三者相等的写法,正确的三者相等判断应该是a = b AND b = c。 - 嵌套IF的语法混乱:
- 第三层
IF的条件完全缺失,原代码里的a+b Triangle是明显的输入错误,本该是判断三边能否构成三角形的条件(比如a + b > c AND a + c > b AND b + c > a)。 - 嵌套
IF不需要用select包裹,多余的子查询写法会直接导致语法报错。
- 第三层
- 判断逻辑顺序颠倒:应该优先判断是否能构成三角形,再去区分三角形类型。原代码先判断等边、等腰,最后才处理非三角形的情况,会导致那些根本构不成三角形的记录被错误归类为等腰或不等边。
- 等腰判断的逻辑冗余(次要):虽然原代码先判断了等边,所以等腰的条件不会误判等边,但如果逻辑顺序调整,这个条件会把等边也归为等腰,不过这属于逻辑严谨性问题,核心问题还是语法和顺序错误。
修正后的参考SQL
SELECT CASE WHEN A + B <= C OR A + C <= B OR B + C <= A THEN 'Not A Triangle' WHEN A = B AND B = C THEN 'Equilateral' WHEN A = B OR B = C OR A = C THEN 'Isosceles' ELSE 'Scalene' END AS triangle_type FROM TRIANGLES;
内容的提问来源于stack exchange,提问作者Rupam
相关产品推荐
相关产品推荐

