其中条件与主键上的OR子句

时间:2016-03-18 00:53:45

标签: sql sybase

我正在尝试使用单个查询来根据empiddeptid获取记录。 我的存储过程的输入可以是empiddeptidempidemployees表中的主键聚簇索引列。

查询花费时间并且我停止执行它,只是想知道考虑这个有效场景还是主键上的子句?

我正在使用sybase

declare @emp_id int null,
@dept_id int null

select emp.* from employees emp
where
(@emp_id is null or emp.emp_id = @emp_id)
and (@dept_id is null or emp.dept_id = @dept_id)

2 个答案:

答案 0 :(得分:1)

您的where条款不会产生您认为应该的内容。它正在尝试将所有输入值的记录都包含在null中,这可能不是您想要的。 (无论如何,那些记录会是什么?)

要获取所有输入值的记录,您需要将is null切换为is not null并交换andor

declare @emp_id int null,
        @dept_id int null

select emp.* from employees emp
where (@emp_id is not null and emp.emp_id = @emp_id)
   or (@dept_id is not null and emp.dept_id = @dept_id)

SQL的三值逻辑通常是关于它的最令人困惑的事情之一。

答案 1 :(得分:0)

您的存储过程应该类似于

create procedure usp_GetEmployeeDetails
  @SearchId INT
AS
BEGIN
    SELECT EMP.*, 'EmployeeID' AS 'MatchedColumn'
    FROM 
    EMPLOYEE
    WHERE EmployeeID = @SearchId

    UNION ALL

    SELECT EMP.*, 'DepartmentID' AS 'MatchedColumn'
    FROM 
    EMPLOYEE
    WHERE DepartmentID = @SearchId
END

这将满足您拥有相同EmployeeID和DepartmentId的场景。但是,我建议两个不同的存储过程用于两个不同的参数 - 一个用于通过EmployeeId检索员工详细信息,另一个用于DepartmentId。

相关问题