You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询中邮箱为NULL时无法强制生成员工编号的问题求助

解决邮箱为空时员工编号始终为NULL的SQL问题

看起来你卡在了一个很容易忽略的小问题上——明明写了CASE分支处理邮箱NULL的情况,结果还是输出NULL。我帮你捋捋问题出在哪,再给你修正后的方案。

问题根源分析

先看子查询里定义EMPLOYEE字段的CASE语句:

CASE WHEN B.emaill = 'xx@some.com' THEN '123456' 
WHEN B.email = 'xy@some.com' THEN '123457' 
WHEN B.email IS NULL THEN '123458' 
ELSE RIGHT('000000' + CONVERT(VARCHAR, C.EMPLOYEE), 6) END AS 'EMPLOYEE'

这里第一个条件里的B.emaill是拼写错误!应该是B.email——数据库里根本没有emaill这个列,所以这个条件会被判定为NULL,虽然不会报错,但会打乱CASE的执行逻辑,导致后续的分支可能没有被正确触发。

另外,当B.email为NULL时,你和EMPLOYEE表的JOIN条件RTRIM(LTRIM(C.EMAIL_ADDRESS)) = LTRIM(RTRIM(B.email))会因为NULL的比较特性(SQL中NULL和任何值比较都是UNKNOWN),导致C表没有匹配行,C.EMPLOYEE会是NULL,但你的CASE分支已经指定了此时返回123458,只要CASE逻辑正确,就不会输出NULL,所以拼写错误才是核心问题。

修正后的SQL语句

我把拼写错误修正,同时优化了一些细节,你可以试试这个版本:

SELECT EMPLOYEE, DATE, [JOB CODE], HM_ACCT_UNIT, 
CASE WHEN SUM(HOURS) < 10.0 THEN LEFT(REPLACE(SUM(ROUND(HOURS, 2)), '.', ''), 3) 
WHEN SUM(HOURS) >= 10.0 THEN LEFT(REPLACE(SUM(ROUND(HOURS, 2)), '.', ''), 4) 
ELSE LEFT(REPLACE(SUM(ROUND(HOURS, 2)), '.', ''), 3) END AS HOURS 
FROM (
    SELECT 
        CASE 
            WHEN B.email = 'xx@some.com' THEN '123456' 
            WHEN B.email = 'xy@some.com' THEN '123457' 
            WHEN B.email IS NULL THEN '123458' 
            ELSE RIGHT('000000' + CONVERT(VARCHAR, C.EMPLOYEE), 6) 
        END AS EMPLOYEE, 
        REPLACE(CONVERT(VARCHAR(10), CAST(a.start AS date), 101), '/', '') AS DATE, 
        '14' AS [JOB CODE], 
        CONVERT(DECIMAL(10, 2), dur) / 60 AS HOURS, 
        CASE WHEN A.project = 'SOMETHINGELSE' THEN '123' ELSE '12345' END AS HM_ACCT_UNIT 
    FROM [dbo].[project] A 
    LEFT OUTER JOIN [dbo].[user] B ON A.uid = B.uid 
    LEFT OUTER JOIN EMPLOYEE C ON RTRIM(LTRIM(C.EMAIL_ADDRESS)) = LTRIM(RTRIM(B.email)) 
    LEFT OUTER JOIN GL D ON D.ACCT_UNIT = C.HM_ACCT_UNIT 
    LEFT OUTER JOIN [dbo].[projList] CPT ON LTRIM(RTRIM(CPT.[Capital Project])) = LTRIM(RTRIM(A.project)) 
    WHERE CONVERT(CHAR(10), a.start, 103) >= DATEADD(DAY, -14, GETDATE()) 
    AND (A.project LIKE '%SOMETHING%' OR A.project = 'SOMETHINGELSE')
) A 
GROUP BY EMPLOYEE, DATE, [JOB CODE], HM_ACCT_UNIT 
ORDER BY DATE 

关键修改点说明

  • 修正拼写错误:把B.emaill改成B.email,确保第一个CASE分支能正常判断,不会干扰后续逻辑
  • 优化数值比较:把SUM(HOURS)的比较值从字符串'10.0'改成数值10.0,避免字符串与数值比较的潜在类型转换问题
  • 规范SQL语法:统一使用AS关键字定义别名,让代码可读性更强

这样修改后,当B.email为NULL时,CASE分支会正确返回123458,结果集中就不会再出现NULL的员工编号了。

内容的提问来源于stack exchange,提问作者Shaji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:47:42