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
相关产品推荐
相关产品推荐

