如果没有选择任何员工,我想选择所有员工,否则需要所选员工的数据。
我已经写了这个查询,但是它抛出了错误。
DECLARE @emp_id INT
SET @emp_id=0 -- This will change based on the selected employee from UI
SELECT * FROM employees
WHERE employee_id in (CASE WHEN @emp_id=0 THEN (SELECT employee_id FROM employees) ELSE @emp_id END)用于重现问题的示例脚本
CREATE TABLE employees (
employee_id INT ,
first_name VARCHAR (20) DEFAULT NULL,
last_name VARCHAR (25) NOT NULL
);
INSERT INTO employees values (1, '1_fname', '1_lname'),(2, '2_fname', '2_lname'),(3, '3_fname', '3_lname'),(4, '4_fname', '4_lname'),(5, '5_fname', '5_lname')我想在单个查询中这样做。
发布于 2021-06-28 14:31:41
假设您使用的是预准备语句,您将需要提供两次所选员工-作为参数1和2:
SELECT * FROM employees
WHERE CASE WHEN COALESCE(?,0) = 0 THEN TRUE ELSE id = ? END发布于 2021-06-28 14:32:08
对于单个查询,我们可以使用相同的表来模拟是否应该显示employees,我们可以使用INNER JOIN。使用此查询将产生所需的输出。
select e.*
from employees e
inner join (
select employee_id,
case
when @emp_id = 0 then true -- will display all employees
when @emp_id = @emp_id then true -- only display selected employee
else false
end as is_shown
from employees
) filter on e.employee_id = filter.employee_id and filter.is_shown = 1;或者使用另一种方法
select employee_id, first_name, last_name
from (
select e.*,
case
when @emp_id = 0 then true
when @emp_id = employee_id then true
else false
end as is_shown
from employees e
) employees
where is_shown = 1;存储过程内部的简单流控制
delimiter $$
use `precise`$$
drop procedure if exists `GetEmployee`$$
create definer=`user`@`%` procedure `GetEmployee`(empID int)
begin
case when empID = 0 then
select *
from employees;
else
select *
from employees
where employee_id = empID;
end case
;
end$$
delimiter ;https://stackoverflow.com/questions/68157967
复制相似问题