ISNULL TSQL SELEC에서 작동하지 않습니다
문제
NULL을 반환 할 수있는 TSQL 선택이 있습니다. IsNull을 사용하여 0으로 교체하려고 시도했지만 어떤 이유로 작동하지 않습니다. 선택한 테이블에는 다음 열이 있습니다.
- Storeid-> int
- 페널티 패턴 -> 소수점 (9,2)
- 페널티 데이트 -> dateTime
SELECT ISNULL(penaltyPercent, 0.0) AS penaltyPercent
FROM dbo.Penalty
WHERE (penaltyDate = (SELECT MAX(penaltyDate) AS date
FROM dbo.Penalty AS Penalty_1
WHERE (penaltyDate <= @date) AND (storeID = @storeID))) AND
(storeID = @storeID)
날짜가 첫 번째 페널티 날짜 이전 (벌금이 0 명인 경우)이되면 결과가 반환되지 않습니다. 이것이 왜 작동하지 않는지 잘 모르겠습니다. 나는 일을하고 있지만 그것은 나를 괴롭 히고있다.
다음은 사용중인 데이터 샘플입니다.
storeID penaltyDate penaltyPercent
182 10/1/2008 12:00:00 AM 0.020000
182 11/1/2008 12:00:00 AM 0.040000
182 12/1/2008 12:00:00 AM 0.070000
해결책
"첫 번째 페널티 날짜 이전 날짜가있을 때"라고 말할 때, 당신은 @date
이 쿼리에서 반환 된 값보다 적습니까?
SELECT MIN(penaltyDate)
FROM Penalty
그러면 내부 쿼리가 Null을 반환하고 (ANSI NULLS를 사용하는 경우)이 부분은 False를 반환합니다.
WHERE (penaltyDate = ...
NULL과의 비교는 항상 NULL을 반환하기 때문입니다. 따라서 널 값으로 하나의 행을 선택하는 대신 행이 없음을 선택합니다.
부록:
이것이 문제인지 확인하려면 외부 쿼리의 첫 번째 줄을
SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent
위에서 설명한 내용 때문에 작동합니다.
다른 팁
@Date <penaltyDate가 있으면 행이 반환되지 않으므로 ISNULL이 행동 할 가치가 없습니다. 페널티 퍼센트를 변수로 선택한 다음 결과 세트로 선택할 수 있습니다. ISNULL(@pentaltyPercent)
.
첫 번째 펜실베이니아 날짜 이전에 날짜가 필요한 데이터가 있습니까? 쿼리가 레코드를 반환하지 않으면 ISNULL 조항이 무엇이든 작동하기 때문에 무엇이든 할 것입니다.
제휴하지 않습니다 StackOverflow