2013-11-15 5 views
3

COALESCE과 비슷한 기능이 있지만 NULL이 아닌 값이 있습니까?NULL이 아닌 값에 대한 ISNULL/COALESCE 카운터 파트

문자열 리터럴 N/A을 반환하는 경우 스칼라 값 함수의 반환 값을 다른 값으로 바꿔야합니다. 이 NULL을 반환하면 내가 사용할 수 있습니다

SELECT COALESCE(dbo.GetFirstSsnInFromSsnOut(RMA.IMEI), RMA.IMEI) AS [IMEI to credit] 
    , OtherColumns 
FROM dbo.TableName 

을하지만 N/A을 반환하기 때문에이 작동하지 않습니다. 나는 또한 사용할 수 있습니다

SELECT CASE WHEN dbo.GetFirstSsnInFromSsnOut(RMA.IMEI)='N/A' 
     THEN RMA.IMEI 
     ELSE dbo.GetFirstSsnInFromSsnOut(RMA.IMEI) 
     END AS [IMEI To Credit]   
    , OtherColumns 
FROM dbo.TableName 

하지만 기록에 두 번 함수를 실행해야하므로 그 비효율적이다.

이 쿼리는 테이블 반환 함수에 있음에 유의하십시오. 당신이 널 값을 반환 GetFirstSsnInFromSsnOut을 변경할 수없는 경우

+0

을하지만 당신은 단지 기능을 수정할 수 없습니다'GetFirstSsnInFromSsnOut' 자체는 NULL 대신 N에게/A를 반환? –

+0

@StephenByrne : 그건 다른 문제/작업을 일으킬 것입니다. 그래서 "깨는 변화"없이 이것을 해결할 수있는 방법이 있는지 먼저 질문했습니다. 이 방법은 이미 수정해야하는 일부 Excel Addins에서 이미 사용되었습니다. –

+0

'GetFirstSsnInFromSsnOut'을 래핑하고 N/A를'NULL'로 변경하는 또 다른 함수를 만드는 것은 어떨까요? 그렇게하면, 당신은'COALESCE'를 사용할 수 있고'GetFirstSsnInFromSsnOut'에 한 번만 호출 할 수 있습니다. – neutrino

답변

9

을 아마도 거기에 당신이 NULLIF 기능을 사용할 수 있습니다, 예를 들어 :

SELECT ISNULL(NULLIF(dbo.GetFirstSsnInFromSsnOut(RMA.IMEI), 'N/A'), RMA.IMEI) AS [IMEI to credit] 
    , OtherColumns 
FROM dbo.TableName; 
+2

@TimSchmelter - 어쨌든이 기능을 두 번 실행할 수 있습니다. ['ISNULL'은 일반적으로'COALESCE'보다 좋습니다.] (http://connect.microsoft.com/SQLServer/feedback/details/336002/unnecessarily-bad-performance-for-coalesce-subquery) –

+0

@MartinSmith : 정말 왜? 나는 그것을 어떤 식 으로든 막을 수 있습니까? –

+1

위의 연결 항목을 참조하십시오. 이 계획이'COALESCE'가'CASE'로 확장 된 방법 때문에 두 번 참조 된 함수를 표시하면'COALESCE'를 ISNULL로 바꿀 수 있습니다 –

5

다음이 시도 :

SELECT COALESCE(dbo.GetFirstSsnInFromSsnOut(NULLIF(RMA.IMEI, 'N/A')), RMA.IMEI) AS [IMEI to credit] , OtherColumns FROM dbo.TableName

+0

덕분에 여러분은 가장 빠르지 만 안드레이의 대답에는 내가 검색 한 기능과 링크가 포함되어 있습니다. 나는 어쨌든 세 가지 모두 upvoted있다. –

5

함수 NULLIF를 인수가 동일하면 null을 반환하고 그렇지 않으면 첫 번째 인수를 반환합니다. 재미와 이익을 위해 유착과 결합 :

select 
    coalesce(
     nullif(dbo.GetFirstSsnInFromSsnOut(RMA.IMEI), 'N/A'), 
     RMA.IMEI 
    ) as [IMEI To Credit] 
    , OtherColumns 
from dbo.TableName