英文:
Cannot Query NULL or Empty Values in a Field or column in a table
问题
我有一个查询,它有99%的工作效果,但我无法查询NULL
或空记录:
dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION = '' OR
dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION IS NULL
我尝试了这两个条件,但是如果我添加了上面的这些条件,下面的SQL语句将不会返回任何行。然而,它确实会查询所有在数据库中输入了位置或职位信息的员工,但我的目标是查询所有在数据库中输入了位置或职位信息的员工,或者位置或职位信息为空或NULL的员工。
我单独查询了Demographics
表,得到了总共1120条记录,我还计算了那些有空白或NULL
(即没有职位头衔或位置)的列,共有316条记录。
果然,当我运行这个查询时,我得到了804条记录,这意味着查询没有查询到Location
或Position Title
中的空列。
有人能看出为什么这个查询不会返回空列吗?
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
提前感谢您的时间和专业知识。
英文:
I have a query that is 99% working, but I cannot query NULL
or empty records for
dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION = '' OR
dbo.HUR_STAFF_DEMOGRAPHICS.DEMOGRAPHICS_POSITION IS NULL
I tried both, but the SQL statement below returns no rows if I add the lines above. However it DOES query rows for ALL staff that have a location and or position entered into the database, but my goal is to query this information for all staff that have a location and or position in the database, or if have a location and or position is NULL or BLANK (empty).
I queried the Demographics
table alone, and I get a total of 1120 records, I also calculated the columns that have BLANK or NULL
(so no position title or Location) and that is 316 records.
Sure enough, when I run this query I get 804 records returned, which means the query is not querying Null
or empty columns for Location
or Position Title
.
Can anyone see why the query will not return the null columns?
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
Thanks in advance for your time and expertise.
答案1
得分: 1
我相信你的问题在于你正在使用DEMOGRAPHICS_POSITION = POSITION_CODE
连接到DEMOGRAPHICS_POSITION
表,但同时也在寻找DEMOGRAPHICS_POSITION = ''
或DEMOGRAPHICS_POSITION = NULL
的值。假设DEMOGRAPHICS_POSITION
表没有空的代码条目,对该表的连接将对这两个条件都失败,并且不会返回任何记录。
解决方案是将该连接更改为LEFT JOIN
,但必须首先重写查询以使用ANSI连接语法。
使用表别名也是一种简化语句并提高可读性的良好实践。
尝试:
SELECT DISTINCT D.employee_no,
first_name,
last_name,
PREFERRED_NAME,
location,
DEMOGRAPHICS_POSITION,
EMPLOYEE_EMAIL,
Location_name,
Description
FROM HUR_STAFF_DEMOGRAPHICS D
JOIN HUR_STAFF_INTERLINK I
ON D.employee_no = I.employee_no
JOIN HUR_LOCATION L
ON D.location = L.Location_no
LEFT JOIN HUR_POSITION_CODE P
ON D.DEMOGRAPHICS_POSITION = P.POSITION_CODE
JOIN HUR_EMAIL_ADDRESS E
ON D.EMPLOYEE_NO = E.EMPLOYEE_NO
WHERE D.employee_status = 'A'
AND (D.DEMOGRAPHICS_POSITION = '' OR D.DEMOGRAPHICS_POSITION IS NULL)
ORDER BY last_name
或者,对于这种特定的用法,你可以完全取消HUR_POSITION_CODE
的连接,以及相应的选择列表引用(Description
是否来自那里?)
英文:
I believe your issue is that you are joining to the DEMOGRAPHICS_POSITION
table on DEMOGRAPHICS_POSITION = POSITION_CODE
, but are also looking for DEMOGRAPHICS_POSITION = '' or DEMOGRAPHICS_POSITION = NULL
values. Assuming that the DEMOGRAPHICS_POSITION
table has no empty code entry, the join to that table will fail for both of these conditions and no record will be returned.
The solution is to change that join to a LEFT JOIN
, but the query must be first rewritten to use ANSI join syntax.
Using table aliases is also a good practice to simplify the statement and improve readability.
Try:
SELECT DISTINCT D.employee_no,
first_name,
last_name,
PREFERRED_NAME,
location,
DEMOGRAPHICS_POSITION,
EMPLOYEE_EMAIL,
Location_name,
Description
FROM HUR_STAFF_DEMOGRAPHICS D
JOIN HUR_STAFF_INTERLINK I
ON D.employee_no = I.employee_no
JOIN HUR_LOCATION L
ON D.location = L.Location_no
LEFT JOIN HUR_POSITION_CODE P
ON D.DEMOGRAPHICS_POSITION = P.POSITION_CODE
JOIN HUR_EMAIL_ADDRESS E
ON D.EMPLOYEE_NO = E.EMPLOYEE_NO
WHERE D.employee_status = 'A'
AND (D.DEMOGRAPHICS_POSITION = '' OR D.DEMOGRAPHICS_POSITION IS NULL)
ORDER BY last_name
Alternately, for this particular usage, you can drop the HUR_POSITION_CODE
join entirely, along with the corresponding select list references (Is that where Description
comes from?)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论