SQL Server의 조건부 WHERE 절
조건부가 필요한 SQL 쿼리를 만들고 있습니다.where절을 클릭합니다.
다음과 같이 해야 합니다.
SELECT
DateAppr,
TimeAppr,
TAT,
LaserLTR,
Permit,
LtrPrinter,
JobName,
JobNumber,
JobDesc,
ActQty,
(ActQty-LtrPrinted) AS L,
(ActQty-QtyInserted) AS M,
((ActQty-LtrPrinted)-(ActQty-QtyInserted)) AS N
FROM
[test].[dbo].[MM]
WHERE
DateDropped = 0
--This is where i need the conditional clause
AND CASE
WHEN @JobsOnHold = 1 THEN DateAppr >= 0
ELSE DateAppr != 0
END
위의 쿼리가 작동하지 않습니다.이것은 올바른 구문이 아닐까요, 아니면 제가 모르는 다른 방법이 있을까요?
다이내믹 SQL을 사용하고 싶지 않습니다.다른 방법이 있나요?아니면 다음과 같은 회피책을 사용해야 하나요?if else동일한 쿼리를 사용하여where조항들?
이거 드셔보세요
SELECT
DateAppr,
TimeAppr,
TAT,
LaserLTR,
Permit,
LtrPrinter,
JobName,
JobNumber,
JobDesc,
ActQty,
(ActQty-LtrPrinted) AS L,
(ActQty-QtyInserted) AS M,
((ActQty-LtrPrinted)-(ActQty-QtyInserted)) AS N
FROM
[test].[dbo].[MM]
WHERE
DateDropped = 0
AND (
(ISNULL(@JobsOnHold, 0) = 1 AND DateAppr >= 0)
OR
(ISNULL(@JobsOnHold, 0) != 1 AND DateAppr != 0)
)
조건부 WHERE에 대한 자세한 내용은 여기를 참조하십시오.
이거 먹어봐-
WHERE DateDropped = 0
AND (
(ISNULL(@JobsOnHold, 0) = 1 AND DateAppr >= 0)
OR
(ISNULL(@JobsOnHold, 0) != 1 AND DateAppr != 0)
)
WHERE 절에서 CASE 식을 사용하는 방법에 대한 기본적인 질문에 답하려면 다음 절차를 따릅니다.
먼저 CASE 식 값은 부울 값이 아닌 일반 데이터 유형 값을 가져야 합니다.바르샤르나 int, 뭐 그런 게 틀림없어요당신이 말할 수 없는 이유와 같다.SELECT Name, 76 = Age FROM [...]그리고 얻을 수 있을 것으로 기대됩니다.'Frank', FALSE결과 세트에 포함시킵니다.
또한 WHERE 절의 모든 식에는 부울 값이 있어야 합니다.varchar 값이나 int 값을 가질 수 없습니다.말할 수 없다WHERE Name;또는WHERE 'Frank';비교 연산자를 사용하여 부울식으로 만들어야 합니다.WHERE Name = 'Frank';
즉, CASE 표현은 부울 표현식의 한쪽에 있어야 합니다.CASE 표현은 무엇과 비교해야 합니다.혼자서는 못 서요!
여기:
WHERE
DateDropped = 0
AND CASE
WHEN @JobsOnHold = 1 AND DateAppr >= 0 THEN 'True'
WHEN DateAppr != 0 THEN 'True'
ELSE 'False'
END = 'True'
마지막으로 왼쪽의 CASE 식에 의해 부울식이 다음 중 하나로 바뀌는 것에 주의해 주십시오.'True' = 'True'또는'False' = 'True'.
에 대해서는 특별한 것은 없습니다.'False'그리고.'True'를 사용할 수 있습니다.0그리고.1원하신다면요
일반적으로 CASE 식을 보다 친숙한 부울식으로 고쳐 쓸 수 있습니다.이것이 일반적으로 퍼포먼스에 도움이 됩니다.그러나 로직 변환보다 기존 식을 사용하는 것이 더 쉽거나 유지보수가 더 용이할 수 있습니다.
당신의 질의에 대한 문제는CASE표현,THEN그리고.ELSE부품은 숫자, varchar 또는 기타 데이터 유형으로 평가되는 식을 가지고 있어야 하지만 부울 값으로 평가해서는 안 됩니다.
부울 논리(또는 SQL이 사용하는 삼진 논리)를 사용하여 다시 쓰면 됩니다.
WHERE
DateDropped = 0
AND ( @JobsOnHold = 1 AND DateAppr >= 0
OR (@JobsOnHold <> 1 OR @JobsOnHold IS NULL) AND DateAppr <> 0
)
조건부 WHERE 절을 사용하는 경우 매우 비효율적인 쿼리로 끝나는 경우가 많습니다. 이는 인덱스가 사용되는 대규모 데이터 집합에서 두드러집니다.파라미터의 다른 값에 대해 쿼리를 최적화하는 가장 좋은 방법은 파라미터의 각 값에 대해 다른 실행 계획을 작성하는 것입니다.이를 실현하기 위해서는OPTION (RECOMPILE).
이 예에서는 큰 차이는 없지만 두 가지 경우 중 하나에서만 조건을 사용해야 한다고 하면 큰 영향을 받을 수 있습니다.
이 예에서는 다음과 같습니다.
WHERE
DateDropped = 0
AND (
(ISNULL(@JobsOnHold, 0) = 1 AND DateAppr >= 0)
OR
(ISNULL(@JobsOnHold, 0) <> 1 AND DateAppr <> 0)
)
OPTION (RECOMPILE)
소스 파라미터 스니핑, 임베디드 및 RECOMFILE 옵션
이 방법은 두 개의 매개 변수 중 하나를 저장 프로시저로 전달할 수 있는 위치에 대해 생각하는 것이 더 쉬워 보였습니다.효과가 있는 것 같습니다.
SELECT *
FROM x
WHERE CONDITION1
AND ((@pol IS NOT NULL AND x.PolicyNo = @pol) OR (@st IS NOT NULL AND x.State = @st))
AND OTHERCONDITIONS
언급URL : https://stackoverflow.com/questions/18629132/conditional-where-clause-in-sql-server
'programing' 카테고리의 다른 글
| 언바인드 세그의 용도와 사용법은 무엇입니까? (0) | 2023.04.11 |
|---|---|
| .text, .value 및 .value2의 차이점은 무엇입니까? (0) | 2023.04.11 |
| Bash에서 인덱스를 지정하지 않고 어레이에 새 요소 추가 (0) | 2023.04.11 |
| index match는 공백 셀에 대해 0을 반환합니다. "-"로 해야 합니다. (0) | 2023.04.11 |
| PowerShell: 단일 명령어 환경 변수 설정 (0) | 2023.04.11 |