题
UI(前的报告显示)表示看起来(组合),
- (ID=0).所有组织单位
- (ID=4).HR
- (ID=5).DEV
我需要:
- 能够表现出数据(4)+(5)如果 (0)是选择。
- 只有(4)或(5)如果人力资源或开发选择。
查找组合代码(选择的供稿中的参数如下查询。)
Select 0 AS ID,'All Org' AS Name from DP_ORG_OrganizationUnit
where DP_ORG_OrganizationUnit.Code IN {AccessData}
Union
SELECT
DP_ORG_OrganizationUnit.ID,
DP_ORG_OrganizationUnit.Name
FROM DP_ORG_OrganizationUnit where DP_ORG_OrganizationUnit.Code IN ('HR','DEV')
报告数据的行查询
SET CONCAT_NULL_YIELDS_NULL OFF
DECLARE @EmpID as int;
DECLARE @OrganizationUnit as int;
DECLARE @StartDate as datetime;
DECLARE @EndDate as datetime;
SET @EmpID = ?;
SET @StartDate = ?;
SET @EndDate = ?;
SET @OrganizationUnit = ?;
SELECT
Employee.Code,
Employee.Name1+' '+Employee.Name2+' '+Employee.Name3+' '+Employee.Name4+' '+Employee.Name5 AS FullName,
Employee.OrganizationUnit,
ContractType.Name,
EmployeeContract.StartDate,
EmployeeContract.EndDate
FROM Employee INNER JOIN (ContractType INNER JOIN EmployeeContract
ON ContractType.ID = EmployeeContract.ContractType)
ON Employee.ID = EmployeeContract.Employee
WHERE (Employee.ID = @EmpID OR @EmpID=0)
AND
(Employee.OrganizationUnit = @OrganizationUnit OR @OrganizationUnit=0)
AND NOT((EndDate < @StartDate or StartDate > @EndDate));
任何办法可以实现这看起来吗?0=0将显示所有的数据从其他 部门。
任何人:-o?
解决方案
第一关,你找组合的代码可以被收紧了一点:
-- the FROM clause was superfluous
SELECT 0 AS ID,'All Org' AS Name
UNION ALL
-- the two-part identifiers were superfluous (only one table)
SELECT ID, Name
FROM DP_ORG_OrganizationUnit
WHERE Code IN ('HR','DEV')
对于所报告的查询,最简单的形式是:
WHERE
((@OrganizationUnit > 0 AND Employee.OrganizationUnit = @OrganizationUnit) OR
(@OrganizationUnit = 0 AND Employee.OrganizationUnit IN (4,5)))
其他提示
像这样的东西应该工作的
Where (Employee.OrganizationUnit = case when @OrganizationUnit=0 then 4 else @OrganizationUnit end OR case when @OrganizationUnit=0 then 5 else @OrganizationUnit end)
试试这个,这应该使用索引,查询...
DECALRE @FilterValues (FilterValue int not null primary key)
IF @Param=0
BEGIN
INSERT INTO @FilterValues VALUES (4)
INSERT INTO @FilterValues VALUES (5)
END
ELSE ID @PAram IS NOT NULL
BEGIN
INSERT INTO @FilterValues VALUES (@Param)
END
SELECT
....
FROM YourTable y
INNER JOIN @FilterValues f ON y.Value=f.Value
WHERE .....
公里的版本将工作,但这种查询并不需要一个临时表...
SELECT *
FROM Employee
WHERE (
@OrganizationUnit = 0
OR
(
@OrganizationUnit <> 0
AND
Employee.OrganizationUnit = @OrganizationUnit
)
)
怎么样
WHERE (Employee.ID = @EmpID OR @EmpID=0)
AND
(Employee.OrganizationUnit BETWEEN ISNULL(NULLIF(@OrganizationUnit,0),0) AND ISNULL(NULLIF(@OrganizationUnit,0),99))
AND NOT((EndDate < @StartDate or StartDate > @EndDate));
不隶属于 StackOverflow