无法查询表字段中NULL或空值的SQL问题排查求助
我的SQL查询已接近完成,但无法查询dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION字段的NULL或空值记录。尝试过添加dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION = '' OR dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION IS NULL条件,但添加后查询无结果。
目前查询仅能返回所有填写了位置或职位的员工记录(共804条),但我的目标是查询所有填写了位置/职位,或位置/职位为NULL/空值的员工信息。单独查询Demographics表共有1120条记录,其中位置或职位为NULL/空值的有316条,说明这部分数据未被当前查询包含。
原SQL语句:
SELECT DISTINCT dbo.HUR_STAFF_DEMOGRAPHICS.employee_no, first_name, last_name, PREFERRED_NAME, location, DEMOGRAPHICS_POSITION, EMPLOYEE_EMAIL, Location_name, Description FROM dbo.HUR_STAFF_DEMOGRAPHICS, dbo.HUR_STAFF_INTERLINK, dbo.HUR_LOCATION, dbo.HUR_POSITION_CODE, dbo.HUR_EMAIL_ADDRESS WHERE dbo.HUR_STAFF_DEMOGRAPHICS.employee_no = dbo.HUR_STAFF_INTERLINK.employee_no AND dbo.HUR_STAFF_DEMOGRAPHICS.location = dbo.HUR_LOCATION.Location_no AND dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION = dbo.HUR_POSITION_CODE.POSITION_CODE AND dbo.HUR_STAFF_DEMOGRAPHICS.EMPLOYEE_NO = dbo.HUR_EMAIL_ADDRESS.EMPLOYEE_NO AND dbo.HUR_STAFF_DEMOGRAPHICS.employee_status = 'A' AND dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION IS NULL ORDER BY last_name
核心问题
你用的是隐式内连接(逗号分隔多张表),并且在WHERE子句里强制要求dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION = dbo.HUR_POSITION_CODE.POSITION_CODE。当DEMOGRAPHICS_POSITION为NULL或空值时,这个等式永远不成立(NULL和任何值比较都返回UNKNOWN,内连接会直接过滤掉这类记录),所以空值的员工数据被排除了。
另外你当前WHERE里还加了AND dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION IS NULL,这和前面的连接条件完全冲突,导致查询无结果。
修复步骤
- 对职位表用左外连接:改用
LEFT JOIN关联HUR_POSITION_CODE,这样即使员工的DEMOGRAPHICS_POSITION为空或NULL,也能保留该员工的记录,对应的职位描述字段会显示为NULL。 - 移除冲突条件:删掉
AND dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION IS NULL,如果需要单独筛选空值职位,再添加对应的条件。 - 建议所有连接都改用显式语法(
JOIN ... ON),避免隐式连接的歧义,让SQL更易读。
修复后的SQL:
SELECT DISTINCT d.employee_no, d.first_name, d.last_name, d.PREFERRED_NAME, d.location, d.DEMOGRAPHICS_POSITION, e.EMPLOYEE_EMAIL, l.Location_name, p.Description FROM dbo.HUR_STAFF_DEMOGRAPHICS d JOIN dbo.HUR_STAFF_INTERLINK i ON d.employee_no = i.employee_no JOIN dbo.HUR_LOCATION l ON d.location = l.Location_no LEFT JOIN dbo.HUR_POSITION_CODE p ON d.DEMOGRAPHICS_POSITION = p.POSITION_CODE -- 左外连接保留空值记录 JOIN dbo.HUR_EMAIL_ADDRESS e ON d.EMPLOYEE_NO = e.EMPLOYEE_NO WHERE d.employee_status = 'A' -- 如需单独查询空/NULL职位,取消下面注释: -- AND (d.DEMOGRAPHICS_POSITION IS NULL OR d.DEMOGRAPHICS_POSITION = '') ORDER BY d.last_name
补充说明
LEFT JOIN会保留左表(HUR_STAFF_DEMOGRAPHICS)所有符合WHERE条件的记录,即使右表(HUR_POSITION_CODE)没有匹配行。- 使用表别名(d、i、l等)简化SQL语句,提升可读性。
- 如果
location字段也可能为空,需要对HUR_LOCATION同样改用LEFT JOIN,否则空location的员工也会被过滤。
内容的提问来源于stack exchange,提问作者microchipmatt

