문제

UI (보고서가 표시하기 전에)는

  • (ID = 0). 모든 조직 단위
  • (ID = 4) .hr
  • (ID = 5) .dev

나는 필요하다 :

  1. (0)이 선택된 경우 (4) + (5)의 데이터를 표시 할 수 있습니다.
  2. HR 또는 DEV가 선택된 경우 (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 .....

KM의 버전은 작동하지만이 쿼리는 온도 테이블이 필요하지 않습니다 ...

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));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top