역시나 sqlleader.co.kr 에서 주고받은 글...

---------

제 목   Re) NULL 데이터와 ? : 3항 연산자와 파생열 변환이 함께 쓰였을 때 이상한 동작
· 작성자    한대성
· 글정보   Hit : 7, Date : 2007/02/23 00:32

Null에 대한 처리로 인한 것 같습니다..
 
(is_dnt_goods_yn1 == "Y") ? "Y" : "N"
의 조건식에서 is_dnt_goods_yn1이 NULL 인 경우에는 "N"이 아닌 NULL로 처리됩니다.
 
NULL 이 "Y"는 아니지만, 그렇다고 해서 "Y"가 아닌 것도 아니기 때문에..
 
말씀하신 조건에 대한 조건식은 다음과 같이 하면 어떨까 합니다..
 
is_dnt_goods_yn2 == "A" && !ISNULL(is_dnt_goods_yn2) ? "A" : (is_dnt_goods_yn1 == "Y" && !ISNULL(is_dnt_goods_yn1) ? "Y" : "N")
 
조건 중에 "A가 아니면, ... Y가 아니면..." 이라는 조건 때문에 단순히   !ISNULL()   로만 판단하면 안되지 않을까 생각되네요..^^
 
 




 
작성자 : 박노철 , 등록일 : 2007-02-22 오후 5:31:00
 
파생열 변환과 관련하여 아무래도 이해가 잘 되지 않는 점이 있어서 다시 질문드립니다. 다음과 같은 소스 데이터가 있습니다.
 
select * from is_dnt_goods_src
 
is_dnt_goods_yn1 is_dnt_goods_yn2
---------------- ----------------
Y                NULL
Y                NULL
Y                NULL
Y                NULL
Y                NULL
NULL             A
NULL             A
NULL             A
NULL             A
Y                NULL
Y                NULL
Y                NULL
Y                NULL
Y                NULL
Y                NULL
Y                NULL
NULL             A
NULL             A
NULL             A
NULL             A
NULL             A
NULL             A
Y                NULL
Y                NULL
Y                NULL
Y                NULL
Y                NULL
Y                NULL
 
여기서 필요한 비즈니스 로직은 is_dnt_goods_yn 이라는 필드값을 파생열 변환을 사용해서 새 열로 만들어내는데,
 
'is_dnt_goods_yn2 가 A 면 A를 리턴하고 A가 아니면(NULL이거나 다른값) 이면 is_dnt_goods_yn1 을 검사해서 그 값이 Y면 Y를 리턴하고 그게 아니면(NULL이거나 다른값) 이면 N 를 리턴한다'
 
입니다. 위의 로직을 파생열 변환에서 다음과 같이 구현해보았습니다.
 
is_dnt_goods_yn      <새열로 추가>   is_dnt_goods_yn2 == 'A' ? 'A' : ((is_dnt_goods_yn1 == 'Y') ? 'Y' : 'N')
 
결과는 다음과 같습니다.
is_dnt_goods_yn1 is_dnt_goods_yn2 is_dnt_goods_yn
---------------- ---------------- ---------------
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
NULL             A                A
NULL             A                A
NULL             A                A
NULL             A                A
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
NULL             A                A
NULL             A                A
NULL             A                A
NULL             A                A
NULL             A                A
NULL             A                A
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
Y                NULL             NULL
 
A는 제대로 넘어오는데 Y값이 제대로 채워지지 않습니다. 아무래도 이상해서 파생열 변환의 expression 을 바꿨습니다.
 
!ISNULL(is_dnt_goods_yn2) ? is_dnt_goods_yn2 : (!ISNULL(is_dnt_goods_yn1) ? is_dnt_goods_yn1 : 'N')
 
NULL을 검사하도록 했죠. 그랬더니 다음과 같이 나왔습니다.
 
is_dnt_goods_yn1 is_dnt_goods_yn2 is_dnt_goods_yn
---------------- ---------------- ---------------
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
NULL             A                A
NULL             A                A
NULL             A                A
NULL             A                A
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
NULL             A                A
NULL             A                A
NULL             A                A
NULL             A                A
NULL             A                A
NULL             A                A
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
Y                NULL             Y
 
정확한 결과가 나왔습니다.
 
제가 expression 을 잘못 사용한 것일까요? 3항 연산자 evaluate 하는데 버그가 있는 것일까요? -_-;;;;
이거때문에 정말 한참을 헤맸습니다. 흑. 혹시 이런 경우를 겪어 보셨는지요????
 
 
 
 

박노철 아.. 그렇군요. 감사합니다. DB에서 적용되던 TRUE, FALSE, NULL 의 원리가 SSIS 스크립트에서도 그대로 적용되는 모양이군요. 보통 프로그래밍 언어에서 하듯이 하면 될 줄 알았는데. 다시 한번 감사드립니다^^ 2007/02/23  

Posted by maceo

02 23, 2007 09:28 02 23, 2007 09:28
, ,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/88

Trackback URL : http://merritt.co.kr/tt/trackback/88

Leave a comment
[로그인][오픈아이디란?]
« Previous : 1 : ... 29 : 30 : 31 : 32 : 33 : 34 : 35 : 36 : 37 : ... 74 : Next »

블로그 이미지

가늘어도 긴놈이 장땡

- maceo

Archives

Authors

  1. maceo

Calendar

«   9 2010   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Site Stats

Total hits:
179883
Today:
2
Yesterday:
35