我正在尝试使用单个查询来根据empid
或deptid
获取记录。
我的存储过程的输入可以是empid
或deptid
。
empid
是employees
表中的主键聚簇索引列。
查询花费时间并且我停止执行它,只是想知道考虑这个有效场景还是主键上的子句?
我正在使用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)
答案 0 :(得分:1)
您的where
条款不会产生您认为应该的内容。它正在尝试将所有输入值的记录都包含在null
中,这可能不是您想要的。 (无论如何,那些记录会是什么?)
要获取所有输入值的记录,您需要将is null
切换为is not null
并交换and
和or
。
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。