SQL中CASE WHEN的正确用法与避坑指南
1. 为什么你写的SQL总在“查不到想要的数据”——从一条被忽略的CASE WHEN说起刚入行那会儿我负责给市场部做周报每天要从用户行为日志里筛出“当天完成注册且点击了首页Banner”的人。最开始我写的是两个独立查询先SELECT注册用户ID再用IN子句去查Banner点击记录。结果跑出来数据对不上——明明后台看到有200人注册报表却只显示137人匹配成功。折腾半天才发现有些用户注册后5分钟内就关了页面根本没触发Banner曝光事件自然也不会产生点击日志。这种“有A不一定有B”的逻辑断层光靠WHERE和JOIN根本兜不住。这时候我才真正理解SQL不是只会“找东西”更要会“做判断”。而CASE WHEN就是SQL里唯一能让你在数据库层面直接写“如果…那么…否则…”的语法结构。它不依赖应用层拼接、不增加网络往返、不引入空值歧义是真正把业务逻辑下沉到查询语句里的关键能力。无论是电商中“订单状态已支付但未发货→标记为待履约”还是教育平台里“学习时长≥45分钟且完成测验→发放结课证书”甚至财务系统中“金额10万→走二级审批流”背后都离不开CASE WHEN的精准分流。它不是高级技巧而是每个需要写SQL的人绕不开的基本功——尤其当你开始处理真实业务中那些“大部分情况如此但总有例外”的场景时它就是你手里的瑞士军刀。2. CASE WHEN不是IF ELSE的翻版理解它的不可替代性与设计哲学2.1 它解决的从来不是“要不要执行”而是“如何归类与转换”很多新手第一次接触CASE WHEN下意识把它当成编程语言里的if-else以为只是控制流程分支。这是个危险的误解。SQL本身没有“执行路径”的概念——它不逐行运行而是声明式地描述“我要什么结果”。CASE WHEN真正的价值在于在单次扫描中完成多维度的即时分类与值映射。举个典型例子某SaaS公司要统计客户健康度得分。原始表里只有last_login_days_ago距上次登录天数和feature_usage_count本周功能使用次数两个字段。业务规则是登录≤7天 且 使用≥5次 → 健康score100登录8-30天 或 使用2-4次 → 亚健康score60其他情况 → 风险score20如果不用CASE WHEN你得怎么写方案A写三个UNION ALL子查询每个查一种状态再合并方案B在应用层取回所有原始数据用Python/Java循环判断赋值方案C建三张临时表分别存三种状态用户再LEFT JOIN回来。这三种方案全都有硬伤A增加解析开销且难维护规则变更B把计算压力推给应用服务器网络传输大量冗余字段C需要额外存储空间且无法实时响应。而CASE WHEN一行搞定SELECT user_id, CASE WHEN last_login_days_ago 7 AND feature_usage_count 5 THEN 100 WHEN last_login_days_ago BETWEEN 8 AND 30 OR feature_usage_count BETWEEN 2 AND 4 THEN 60 ELSE 20 END AS health_score FROM users;关键点在于这个计算发生在数据库引擎内部与数据扫描同步进行不产生中间结果集也不离开存储层。就像工厂流水线上的分拣机器人——原料原始行经过时直接贴上对应标签score值无需暂停、无需搬运、无需二次加工。2.2 两种语法形态简单CASE与搜索CASE选错等于埋雷CASE WHEN其实有两种写法很多人混用却不知区别简单CASESimple CASECASE column_name WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default END特点只能做等值判断且比较对象必须是单个列或表达式。优势是解析快适合枚举型字段映射比如把status_code转成中文状态名。搜索CASESearched CASECASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default_result END特点支持任意布尔表达式,,IS NULL,LIKE, 子查询等条件间可交叉、可嵌套。90%的真实业务逻辑都落在这个范畴。提示永远优先用搜索CASE。简单CASE看着简洁但一旦需求变成“status_code1且created_at‘2023-01-01’”你就只能改写成搜索CASE前期省的那几行代码后期维护时加倍奉还。2.3 为什么它不能被COALESCE或NULLIF替代常有人问“我用COALESCE处理空值用NULLIF过滤特定值是不是就够了”——这是对问题边界的严重误判。COALESCE(a,b,c)只解决“取第一个非NULL值”本质是空值兜底没有逻辑分支NULLIF(a,b)只解决“当ab时返回NULL”是单条件二值判断而CASE WHEN是N路分支任意条件组合任意返回值类型的完整决策树。实测对比某金融系统需将交易类型码转为风控等级code1,3,5 → 高风险需人工复核code2,4 → 中风险自动放行但记录日志code6,7 → 低风险直通其他 → 未知打标待排查用COALESCE根本无法表达多条件分组。用嵌套NULLIF写到第三层就开始怀疑人生。而CASE WHEN清晰如白话CASE transaction_code WHEN 1 THEN high WHEN 3 THEN high WHEN 5 THEN high WHEN 2 THEN medium WHEN 4 THEN medium WHEN 6 THEN low WHEN 7 THEN low ELSE unknown END或者更紧凑的搜索CASE写法推荐CASE WHEN transaction_code IN (1,3,5) THEN high WHEN transaction_code IN (2,4) THEN medium WHEN transaction_code IN (6,7) THEN low ELSE unknown END这才是生产环境该有的写法——条件聚合明确后续加新code只需改IN列表不碰主干逻辑。3. 从入门到避坑CASE WHEN的实操细节与参数陷阱3.1 返回值类型必须严格一致否则隐式转换会吃掉你的数据这是新手踩坑率最高的点。看这个反例-- 错误示范混合字符串和数字 SELECT CASE WHEN amount 1000 THEN VIP WHEN amount 100 THEN 10 -- 这里返回整数 ELSE normal END AS level FROM orders;表面看没问题但数据库会强制把所有分支统一为同一类型。多数引擎如PostgreSQL会尝试转成TEXT于是10变成字符串10而MySQL更激进会把VIP转成数字0因为字符串转数字失败默认为0导致VIP用户全被标成0级实测某次线上事故就是因此导致优惠券发放逻辑错乱。正确做法显式类型转换确保所有THEN分支返回同类型值。✅ 推荐写法全部返回VARCHARCASE WHEN amount 1000 THEN VIP WHEN amount 100 THEN GOLD ELSE normal END AS level如果真需要数字编码就全部用数字CASE WHEN amount 1000 THEN 3 WHEN amount 100 THEN 2 ELSE 1 END AS level_code3.2 条件顺序不是“随便排”而是性能与正确性的双重博弈CASE WHEN的条件是从上到下顺序执行遇到第一个为TRUE的分支即返回结果不再检查后续。这意味着性能角度高频条件放前面减少平均判断次数。比如用户表中95%的记录statusactive那WHEN statusactive必须放在第一条逻辑角度范围条件必须由细到粗否则粗粒度条件会截断细粒度判断。反例来了-- 危险会导致amount1500的记录永远进不了VIP分支 CASE WHEN amount 100 THEN GOLD -- 100以上全被这里捕获 WHEN amount 1000 THEN VIP -- 永远执行不到 ELSE normal END✅ 正确顺序由大到小CASE WHEN amount 1000 THEN VIP WHEN amount 100 THEN GOLD ELSE normal END更严谨的做法是用BETWEEN明确区间避免边界重叠CASE WHEN amount 1000 THEN VIP WHEN amount BETWEEN 101 AND 1000 THEN GOLD WHEN amount BETWEEN 1 AND 100 THEN SILVER ELSE normal END3.3 在GROUP BY和ORDER BY中复用CASE表达式别重复写三次复杂报表常需按分类维度聚合或排序。常见错误是-- ❌ 重复写三次维护噩梦 SELECT CASE WHEN score90 THEN A WHEN score80 THEN B ELSE C END AS grade, COUNT(*) FROM students GROUP BY CASE WHEN score90 THEN A WHEN score80 THEN B ELSE C END ORDER BY CASE WHEN score90 THEN A WHEN score80 THEN B ELSE C END;不仅冗长改一个条件要同步改三处。现代SQL标准ANSI SQL:2003起支持列别名在GROUP BY/ORDER BY中直接引用-- ✅ 清晰高效改一处全生效 SELECT CASE WHEN score90 THEN A WHEN score80 THEN B ELSE C END AS grade, COUNT(*) AS cnt FROM students GROUP BY grade ORDER BY grade;注意MySQL 5.7及更早版本不支持此特性需用位置序号GROUP BY 1, ORDER BY 1但可读性差建议升级到8.0。3.4 处理NULL的终极方案IS NULL必须显式写别信“ NULL”新手常犯的致命错误-- ❌ 永远返回FALSE因为NULL NULL在SQL中是UNKNOWN不是TRUE CASE WHEN status NULL THEN unknown -- 这行永远不会触发 ELSE status END正确写法只有两种-- 方案1用IS NULL推荐语义清晰 CASE WHEN status IS NULL THEN unknown ELSE status END -- 方案2用IS NOT DISTINCT FROMPostgreSQL特有可同时处理NULL相等 CASE WHEN status IS NOT DISTINCT FROM active THEN active_user ELSE other END实操心得我在审计某电商订单表时发现因用status 代替status IS NULL导致12%的“空状态”订单被错误归入“其他”分类实际是导出脚本漏处理NULL值。从此所有涉及NULL的CASE分支我都会在条件前加注释-- handle NULL explicitly强迫自己过一遍。4. 高阶实战CASE WHEN如何撬动复杂分析与性能优化4.1 构建动态指标一行SQL实现多口径统计传统做法为“付费用户数”、“试用转化率”、“高价值用户占比”各写一条SELECT再用应用层合并。而CASE WHEN配合聚合函数可单次扫描产出全部指标SELECT COUNT(*) AS total_users, COUNT(CASE WHEN is_paid true THEN 1 END) AS paid_users, COUNT(CASE WHEN trial_end_date CURRENT_DATE AND is_paid true THEN 1 END) AS converted_users, COUNT(CASE WHEN lifetime_value 5000 THEN 1 END) AS high_value_users, ROUND( 100.0 * COUNT(CASE WHEN is_paid true THEN 1 END) / NULLIF(COUNT(*), 0), 2 ) AS paid_rate_pct, ROUND( 100.0 * COUNT(CASE WHEN trial_end_date CURRENT_DATE AND is_paid true THEN 1 END) / NULLIF(COUNT(CASE WHEN trial_end_date CURRENT_DATE THEN 1 END), 0), 2 ) AS conversion_rate_pct FROM users;关键技巧COUNT(CASE WHEN condition THEN 1 END)统计满足条件的行数因COUNT忽略NULL不满足条件时返回NULL自然被跳过NULLIF(denominator, 0)防止除零错误比CASE WHEN denominator0 THEN NULL ELSE ... END更简洁所有计算基于单表一次全扫描IO成本最低。4.2 与窗口函数联用实现“分组内条件排名”这类硬需求某游戏公司要查“每款游戏中付费最高的前3名玩家”。单纯用ROW_NUMBER() OVER(PARTITION BY game_id ORDER BY amount DESC)会把免费玩家也排进去。需求其实是“只对付费玩家amount0排名且每款游戏最多取3人”。这时CASE WHEN就是破局点WITH paid_players AS ( SELECT game_id, player_id, amount, ROW_NUMBER() OVER( PARTITION BY game_id ORDER BY amount DESC ) AS rn FROM players WHERE amount 0 -- 先过滤减少窗口计算量 ) SELECT game_id, player_id, amount FROM paid_players WHERE rn 3;但若需求升级为“付费玩家排前3免费玩家统一标为‘free’并放在最后”就需要CASE WHEN介入排序逻辑SELECT game_id, player_id, amount, CASE WHEN amount 0 THEN ROW_NUMBER() OVER( PARTITION BY game_id ORDER BY amount DESC ) ELSE 999999 -- 免费玩家统一用超大序号确保排最后 END AS display_order FROM players ORDER BY game_id, display_order LIMIT 100; -- 每款游戏取前100名含免费4.3 性能优化关键让CASE WHEN成为索引友好型操作CASE WHEN本身不走索引但合理设计能让它“借力”索引。核心原则把可索引的条件放在WHEN子句最左侧且避免在列上做函数运算。反例索引失效-- ❌ 对create_time加函数无法使用索引 CASE WHEN DATE(create_time) 2024-01-01 THEN new_year ... END✅ 正确写法利用索引范围扫描CASE WHEN create_time 2024-01-01 AND create_time 2024-01-02 THEN new_year ... END更进一步若业务中70%的查询都按“月度分组”可提前在表上建表达式索引PostgreSQLCREATE INDEX idx_orders_month ON orders ((TO_CHAR(create_time, YYYY-MM)));然后CASE WHEN直接用CASE WHEN TO_CHAR(create_time, YYYY-MM) 2024-01 THEN january ... END此时数据库能直接走索引速度提升10倍以上。4.4 与CTE结合拆解多层业务规则告别意大利面条式SQL某保险系统保费计算规则长达2页纸基础保费 保额 × 费率系数费率系数由年龄、职业、健康状况三维决定年龄分段18-30→0.8, 31-50→1.0, 51→1.5职业风险教师→0.9, 程序员→1.1, 建筑工人→1.8健康状况优→0.95, 良→1.0, 差→1.3如果全塞进一个CASE WHEN就是灾难-- ❌ 不可维护的怪物 CASE WHEN age BETWEEN 18 AND 30 AND jobteacher AND healthexcellent THEN 0.8*0.9*0.95 WHEN age BETWEEN 18 AND 30 AND jobteacher AND healthgood THEN 0.8*0.9*1.0 ... -- 还有20多种组合 END✅ 正确解法用CTE分层计算每层专注一个维度WITH base_premium AS ( SELECT policy_id, coverage_amount, -- 第一层年龄系数 CASE WHEN age BETWEEN 18 AND 30 THEN 0.8 WHEN age BETWEEN 31 AND 50 THEN 1.0 ELSE 1.5 END AS age_factor, -- 第二层职业系数 CASE job WHEN teacher THEN 0.9 WHEN programmer THEN 1.1 WHEN construction_worker THEN 1.8 ELSE 1.0 END AS job_factor, -- 第三层健康系数 CASE health WHEN excellent THEN 0.95 WHEN good THEN 1.0 WHEN poor THEN 1.3 ELSE 1.0 END AS health_factor FROM policies ), final_calc AS ( SELECT policy_id, coverage_amount, ROUND(coverage_amount * age_factor * job_factor * health_factor, 2) AS premium FROM base_premium ) SELECT * FROM final_calc;这样写的好处每个CTE只解决一个问题逻辑隔离改年龄分段不影响职业系数可单独测试各层输出快速定位问题环节后续加“地域系数”只需新增一个CTE不改动原有结构。5. 真实故障复盘那些年CASE WHEN引发的线上事故与救火指南5.1 事故现场凌晨2点的财务对账偏差现象某支付平台每日02:00跑的对账任务连续3天显示“应收金额比银行回单少17.3万元”但人工抽样核对单笔订单均无误。排查过程先查对账SQL核心是按payment_status分组求和SELECT CASE WHEN status IN (success,refunded) THEN settled WHEN status pending THEN pending ELSE failed END AS group_status, SUM(amount) FROM payments GROUP BY group_status;发现refunded订单被计入settled但财务要求“退款不计入应收”应收只算success。问题根源业务方口头说“成功和退款都算已结算”但财务系统定义“结算资金已到账”退款是资金流出。更致命的是refunded状态在数据库里实际存为refunded_success因历史原因而CASE WHEN的IN (success,refunded)根本匹配不到修复方案立即修正CASE条件WHEN status IN (success, refunded_success)补充数据清洗对存量refunded_success记录加注释说明业务含义建立元数据字典表将状态码与业务含义绑定CASE WHEN从此从硬编码改为关联查询。教训CASE WHEN的条件值必须与源数据完全一致包括大小写、下划线、前后空格。我后来在所有CASE分支前加了TRIM(UPPER(status))标准化处理并在ETL环节增加状态码校验告警。5.2 事故现场APP端用户等级显示全乱现象iOS用户反馈个人主页等级图标显示为“”Android端正常。后端日志显示SQL执行无异常。根因分析用户等级计算SQL中用了CASE WHEN vip_level 5 THEN diamond ... END但iOS客户端传参时vip_level字段被序列化为字符串6而数据库字段是INTMySQL在比较6 5时会把字符串转成数字6结果为TRUEPostgreSQL则严格类型检查text integer直接报错但因应用层捕获了异常并返回默认值所以没报错日志最终iOS端收到空字符串图标渲染失败。解决方案统一在SQL层做强制类型转换CAST(vip_level AS INTEGER)在API网关层增加参数类型校验字符串数字字段必须转为数值再透传所有涉及CASE WHEN的数值比较前置加ISNUMERIC()或REGEXP ^[0-9]$校验。5.3 常见问题速查表5分钟定位你的CASE WHEN故障问题现象可能原因快速验证方法解决方案查询结果为空或NULL过多CASE分支未覆盖所有情况且缺少ELSE执行SELECT COUNT(*) FROM table WHERE [所有WHEN条件] IS FALSE必须写ELSE分支哪怕只是ELSE unhandled数值计算结果异常如全为0分支返回值类型不一致触发隐式转换查看执行计划中的Output列类型或用pg_typeof()检测显式CAST所有分支为同一类型如CAST(1 AS NUMERIC)查询变慢执行计划显示全表扫描WHEN条件中对列使用函数如UPPER(name)EXPLAIN ANALYZE看是否走了索引改用范围条件或建函数索引如CREATE INDEX ON t (UPPER(name))GROUP BY报错“column must appear in GROUP BY”在SELECT中用了CASE WHEN别名但GROUP BY未引用尝试GROUP BY 1看是否通过升级数据库或改用列位置引用避免别名依赖与应用层结果不一致数据库时区与应用时区不同影响CURRENT_DATE等函数SELECT NOW(), CURRENT_DATE, EXTRACT(TIMEZONE FROM NOW())统一设置数据库时区或在SQL中显式指定AT TIME ZONE UTC5.4 我的CASE WHEN黄金 checklist上线前必过每次写完含CASE WHEN的SQL我都会机械性检查这5项十年来零生产事故[ ] 所有分支返回值类型是否完全一致→ 用pg_typeof()PostgreSQL或SQL_VARIANT_PROPERTY()SQL Server验证[ ] 是否存在未覆盖的NULL值场景→ 在每个WHEN前加OR column IS NULL测试或单独写WHEN column IS NULL分支[ ] 条件顺序是否遵循“高频优先、范围由细到粗”→ 查看表统计信息pg_stats确认各条件选择率[ ] 是否在WHERE/HAVING中重复写了相同CASE逻辑→ 提取为CTE或子查询确保DRYDont Repeat Yourself[ ] 是否有跨库/跨版本兼容性风险→ MySQL用IF()替代部分CASESQL Server支持IIF()但生产环境坚持用标准CASE。最后分享个小技巧我把常用CASE逻辑做成SQL Snippet模板存在VS Code里。比如“日期分段”模板-- date_range: [start] to [end], e.g., 2024-01-01 to 2024-01-31 CASE WHEN ${1:date_col} ${2:2024-01-01} AND ${1:date_col} ${3:2024-02-01} THEN ${4:january} WHEN ${1:date_col} ${3:2024-02-01} AND ${1:date_col} ${5:2024-03-01} THEN ${6:february} ELSE other END填参数时自动生成既快又准。毕竟写SQL不是炫技而是用最稳的方式把业务逻辑准确无误地刻进数据库的基因里。

相关新闻

Unity内存泄漏排查实战:使用Memory Profiler定位与优化性能

Unity内存泄漏排查实战:使用Memory Profiler定位与优化性能

1. 项目概述与核心痛点最近在优化一个上线前的Unity项目,版本是2021.3.8f1c1,团队反馈在低端安卓设备上,游戏运行一段时间后会出现明显的卡顿、掉帧,甚至闪退。初步排查,CPU和GPU负载都正常,但内存占用却像…

2026/10/12 13:43:58 阅读更多 →
Ubuntu 22.04 编译安装与实战 redis-plus-plus C++ 客户端

Ubuntu 22.04 编译安装与实战 redis-plus-plus C++ 客户端

1. 项目概述:为什么选择 redis-plus-plus?如果你正在用 C 开发一个需要高性能数据缓存、消息队列或者会话存储的后端服务,那么 Redis 大概率是你的技术栈选项之一。作为一个 C 开发者,直接去解析 Redis 的 RESP 协议或者用裸的 so…

2026/10/9 7:34:22 阅读更多 →
Flutter页面拦截器实现与应用指南

Flutter页面拦截器实现与应用指南

1. Flutter页面拦截器概述在Flutter应用开发中,页面拦截器是一种强大的导航控制机制,它允许开发者在页面跳转发生前后执行自定义逻辑。这种机制类似于网络请求中的拦截器,但专门用于处理页面路由事件。页面拦截器最常见的应用场景包括&#x…

2026/10/12 12:22:34 阅读更多 →

最新新闻

豆瓣影评情感分析:朴素贝叶斯文本分类实战

豆瓣影评情感分析:朴素贝叶斯文本分类实战

简介:面向人工智能与自然语言处理初学者的情感分析实践项目,聚焦豆瓣Top250影评数据,基于朴素贝叶斯分类器完成正负面情感判别。资料涵盖Scrapy爬虫采集的约5万条影评语料,好评差评比例均衡,并按照4:1划分训练集与测试…

2026/10/12 13:43:55 阅读更多 →
操作系统T1考题解析:进程状态迁移与上下文切换双线推演

操作系统T1考题解析:进程状态迁移与上下文切换双线推演

1. 项目概述:这是一份面向操作系统的教学实操型考题解析,不是试卷搬运工“第2单元进程的描述与控制考试T1”——光看标题,你可能以为这只是某高校《操作系统原理》课程的一道普通期中题。但作为带过十几届系统课实验的从业者,我得…

2026/10/12 13:43:55 阅读更多 →
Java中extends与implements的区别:从语法到设计选型

Java中extends与implements的区别:从语法到设计选型

1. 为什么这两个关键字总让人犯迷糊刚入行那会儿,我在一个后台管理系统里写代码,需要定义一个订单服务类。当时脑子里想的是“订单服务是一种服务,那就用 extends 继承一个基础服务类吧”,结果写着写着发现基础服务类里有一堆跟订…

2026/10/12 13:43:55 阅读更多 →
C语言浮点数精度陷阱与避坑指南:从IEEE 754到工程实践

C语言浮点数精度陷阱与避坑指南:从IEEE 754到工程实践

1. 从"整数思维"到"浮点思维"的认知切换很多人学C语言学到浮点数这一块,都会有一种"好像懂了但又好像没懂"的感觉。声明一个float变量、打印用%f、做做加减乘除,看起来和整数没什么区别。但一旦程序跑出0.1 0.2 ! 0.3这种…

2026/10/12 13:43:55 阅读更多 →
运动估计实验从零到一:块匹配原理、实现与调参避坑指南

运动估计实验从零到一:块匹配原理、实现与调参避坑指南

1. 运动估计到底在解决一个什么问题很多人第一次接触运动估计,脑子里冒出来的画面是摄像头追踪一个跑来跑去的人。这个理解不算错,但只看到了冰山一角。运动估计真正要回答的核心问题其实非常朴素:同一场景在相邻两帧画面里,像素点…

2026/10/12 13:43:55 阅读更多 →
【yyds】大模型开发新风向:上下文工程接管AI编程,RAG真的凉了吗?用TaoToken统一Key实测进阶指南

【yyds】大模型开发新风向:上下文工程接管AI编程,RAG真的凉了吗?用TaoToken统一Key实测进阶指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 13:42:54 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →