문제

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 조항이 무엇이든 작동하기 때문에 무엇이든 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top