2013-06-04 22 views
2

enter image description hereWHERE子句 - 用NULL列记录没有显示

enter image description here

概念

Org_Structure有部门和办事处的独特组合。在Emp_Positions表中,每个员工被分配到组织结构中的部门/办公室或“连锁”的特定组合。但有些员工不应该属于办公室,因此他们被分配到一个链,其中office_id列为NULL。 在第二张图片上,这名员工被涂成红色。

的错误

所提供的存储过程可以发现只有那些既dep_id和office_id是NOT NULL链的员工。如果在某些记录中,office_id为NULL,或者dep_id为NULL,则不会显示此记录。查看第二张图片,结果中不会显示红色的记录。一旦我用值替换NULL,它就会显示出来。如果我用NULL替换任何行的任何列,则整行不会显示。

我试图找到修复它的方法,但我无法弄清楚......在这里,伙计们已经帮助我使这个过程工作,我非常感谢这一点,但WHERE子句仍然越野车...

这是存储过程:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE FilterEmpList 
    @empName nvarchar(250) = null, 
    @empDepID int = null, 
    @empOfficeID int = null, 
    @empPosID int = null  
AS 
BEGIN 
SELECT 
    E.emp_id, 
    E.emp_name,  
    P.pos_name, 
    D.dep_name, 
    O.office_name 
FROM dbo.Org_Structure OS 
    JOIN dbo.Emp_Positions EP ON OS.chain_id=EP.chain_id 
    JOIN dbo.Employees E ON EP.emp_id=E.emp_id 
    JOIN dbo.Positions P ON P.pos_id=EP.pos_id 
    JOIN dbo.Departments D ON D.dep_id=OS.dep_id 
    LEFT JOIN dbo.Offices O ON O.office_id=OS.office_id 
WHERE (E.emp_name LIKE '%'[email protected]+'%' OR @empName IS NULL) 
    AND OS.dep_id = ISNULL(@empDepID, OS.dep_id) 
    AND OS.office_id = ISNULL(@empOfficeID, OS.office_id) 
    AND EP.pos_id = ISNULL(@empPosID, EP.pos_id) 
END 

*与LEFT JOIN添加它仍然无法正常工作

公关OBLEM已决议

看评论

+0

您有'JOIN dbo.Offices O ON O.office_id = OS.office_id'。当'OS.office_id'为'NULL'时,你预期会发生什么?尝试做一个'LEFT JOIN' –

+0

是的,我知道办公室表没有id = NULL的办公室。但我不知道如何修改存储过程来显示这些记录。这就是我问的原因。 – SWA

+1

尝试将该行更改为:'LEFT JOIN dbo.Offices O ON O.office_id = OS.office_id' –

回答

2

问题是固定的,但我注意到有没有解释为什么它的固定。所以,我们去:

在SQL中,任何类型的变量都可以接收NULL值。此值旨在表示没有值或未知值。 NULL在一个或两个方面的任何等于或不等式运算符的结果不是真或假,而是NULL时是特殊的。

所以:

'Hello' = 'Hello' -> true 
'Hello' = 'World' -> false 

但是:

'Hello' = NULL -> NULL 
NULL = NULL -> NULL 

这意味着SQL使用与可能值的布尔系统。添加NULL一贯的“真”与“假”遵循以下规则:

TRUE and NULL = NULL 
FALSE and NULL = FALSE 
NULL and NULL = NULL 

TRUE or NULL = TRUE 
FALSE or NULL = NULL 
NULL or NULL = NULL 

NOT NULL = NULL 

在这种情况下,如果“office_id”或“dep_id”为NULL,则条件

OS.dep_id = ISNULL(@empDepID, OS.dep_id) 

或结果

OS.office_id = ISNULL(@empOfficeID, OS.office_id) 

将为NULL。由于具有NULL值的逻辑AND的结果始终为NULL或FALSE,因此处理整个子句子句的结果必须为NULL或FALSE,并且只有当子句的结果为TRUE时才返回行,则不会有行返回。