Вы можете попробовать выполнить фильтрацию заранее:
(для вашего следующего вопроса: такой макет должен быть сделан вами)
DECLARE @ReportFilter TABLE([user_id] VARCHAR(100),report_type VARCHAR(100),report_code VARCHAR(100));
INSERT INTO @ReportFilter VALUES
( 'User_1', 'STATUS', '01' )
,( 'user_1', 'STATUS', '02' )
,( 'User_1', 'EMP_CODE', 'ABC' )
,( 'User_1', 'NATIONALITY', 'ALL' );
DECLARE @Employee_Master TABLE(Emp_Code VARCHAR(100),Emp_Name VARCHAR(100), [status] VARCHAR(100), nationality VARCHAR(100));
INSERT INTO @Employee_Master VALUES
('ABC','test1','01','USA')
,('DEF','test2','99','GB')
,('ABC','test3','02','DE')
,('XYZ','test4','01','FRA');
- это часть вашего запроса
DECLARE @user_id VARCHAR(100)='User_1';
WITH filterSTATUS AS
(
SELECT * FROM @ReportFilter WHERE [user_id]=@user_id AND report_type='STATUS'
AND NOT EXISTS(SELECT 1 FROM @ReportFilter WHERE [user_id]=@user_id AND report_type='STATUS' AND report_code='ALL')
)
,
filterEMPCODE AS
(
SELECT * FROM @ReportFilter WHERE [user_id]=@user_id AND report_type='EMP_CODE'
AND NOT EXISTS(SELECT 1 FROM @ReportFilter WHERE [user_id]=@user_id AND report_type='EMP_CODE' AND report_code='ALL')
)
,filterNATIONALITY AS
(
SELECT * FROM @ReportFilter WHERE [user_id]=@user_id AND report_type='NATIONALITY'
AND NOT EXISTS(SELECT 1 FROM @ReportFilter WHERE [user_id]=@user_id AND report_type='NATIONALITY' AND report_code='ALL')
)
SELECT *
FROM @Employee_Master AS em
WHERE (SELECT COUNT(*) FROM filterSTATUS)=0 OR em.[status] IN (SELECT x.report_code FROM filterSTATUS AS x)
AND (SELECT COUNT(*) FROM filterEMPCODE)=0 OR em.Emp_Code IN (SELECT x.report_code FROM filterEMPCODE AS x)
AND (SELECT COUNT(*) FROM filterNATIONALITY)=0 OR em.nationality IN (SELECT x.report_code FROM filterNATIONALITY AS x);
Для данного набора это возвращает
Emp_Code Emp_Name status nationality
ABC test1 01 USA
ABC test3 02 DE