记录 SQL 语句 遇到的错误 | 行列变换

计算25岁以上和以下的用户数量

https://www.nowcoder.com/practice/30f9f470390a4a8a8dd3b8e1f8c7a9fa

找错误

先看错误代码:

select
    (
        case age
            when age >= 25 then '25岁及以上'
            else '25岁以下'
        end
    ) as age_cut,
    count(*) `number`
from
    user_profile
group by
    age_cut;

再看正确代码:

select
    (
        case
            when age >= 25 then '25岁及以上'
            else '25岁以下'
        end
    ) as age_cut,
    count(*) `number`
from
    user_profile
group by
    age_cut;

细心可以发现:第一个sql 的 case 后面跟了一个 age,这就是错误点!!!

第一个 SQL 错误原因

在 SQL 中,CASE 表达式有两种形式:简单 CASE 表达式和搜索 CASE 表达式。

  • 简单 CASE 表达式:格式为 CASE 表达式 WHEN 值1 THEN 结果1 WHEN 值2 THEN 结果2 ... ELSE 结果N END,它会将 CASE 后面的表达式与每个 WHEN 后面的值进行精确比较。
  • 搜索 CASE 表达式:格式为 CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ... ELSE 结果N END,它会依次计算每个 WHEN 后面的条件表达式。

在第一个 SQL 里,使用了简单 CASE 表达式的语法,但 when age >= 25 并非一个具体的值,而是一个条件表达式,这就导致了语法错误,使得查询无法得到正确的结果。

第二个 SQL 正确原因

第二个 SQL 使用了搜索 CASE 表达式,WHEN age >= 25 是一个合法的条件表达式,SQL 会依次计算每个 WHEN 后面的条件,当条件为真时返回对应的结果。所以这个 SQL 语法正确,可以正常执行,它会根据 user_profile 表中用户的年龄进行分组统计,将年龄大于等于 25 岁的用户归为一组,小于 25 岁的用户归为另一组,并分别统计每组的用户数量。

SQL练练练 文章被收录于专栏

记录自己sql的每一步提升!

全部评论

相关推荐

被普调的六边形战士很高大:项目经历貌似和专业或者求职方向没大关系?
点赞 评论 收藏
分享
被加薪的哈里很优秀:应该继续招人,不会给你留岗位的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务