2017-01-11 4 views
0

SAS에서 PROC SQL 문을 사용할 때 변수를 숫자에서 숫자로 또는 그 반대로 변환해야하는 경우가 있습니다.변수 유형을 문자에서 숫자로 변환하여 SAS에서 불확실한 길이로 변환

INPUT(A.KEY_ID, 8.) = B.KEY_ID 

또는 변수의 길이가 중 7 또는 8 인 경우 내 질문은, 어떤 길이 내가 KEY_ID 후 넣어야한다

A.KEY_ID = PUT(B.KEY_ID, 8.) 

: 나는 일반적으로 다음과 같은 두 개의 쿼리를 사용할 수 있습니까? 나는 A.KEY_ID = PUT (B.KEY_ID, 7.)을 시도했으며 KEY_ID 길이가 8 인 모든 레코드를 잃어 버렸다. 그리고 A.KEY_ID = PUT (B.KEY_ID, 8.)을 사용할 때 길이가 7 인 해당 KEY_ID를 찾을 수 없습니다.

대단히 감사합니다!

추가 :

다음은 현재 사용중인 쿼리입니다. LibnameA는 로컬 라이브러리이고 tableA는 로컬 SAS 테이블입니다. DatabaseB는 내가 연결되어있는 데이터베이스입니다. Key_id 열은 두 테이블에 있으며 키를 연결하는 데 사용됩니다. 예를 들어, key_ids는 1234567, 12345678 및 ect입니다.

put 문 끝 부분에 길이 7을 넣은 다음 쿼리를 사용했을 때 key_ids가 8 자리 인 모든 레코드가 일치하는 항목을 찾을 수 없습니다.

PROC SQL; 
CREATE TABLE LIBNAMEA.WORKTABLE AS 
SELECT 
A.*, 
B.VAR1, 
B.VAR2 
FROM LIBNAMEA.TABLEA A 
LEFT JOIN DATABASEb.TABLEB B 
ON A.KEY_ID = PUT(B.KEY_ID,8.) 
; 
QUIT; 

업데이트 결과 : 나는 다음과 같은 쿼리를 사용하는 경우, 그것은 192,758 행

ON A.KEY_ID = PUT(B.KEY_ID,7.) 

나는 다음과 같은 쿼리를 사용하는 경우

을 반환

, 그것은 192,923 행

ON A.KEY_ID = PUT(B.KEY_ID,8.) 

을 반환 다음 쿼리를 사용하면 192757 행을 반환합니다.

나는 다음과 같은 쿼리를 사용하는 경우 10
ON INPUT(A.KEY_ID,8.) = B.KEY_ID 

, 그것은 192,757 행

ON A.KEY_ID = COMPRESS(PUT(B.KEY_ID,8.)) 

나는 다음과 같은 쿼리를 사용하는 경우

, 그것은 192,757 행
ON COMPRESS(A.KEY_ID) = COMPRESS(PUT(B.KEY_ID,8.)) 

나는 다음과 같은 쿼리를 사용하는 경우

를 돌려줍니다 192757 행을 반환합니다.

ON INPUT(CATS(A.KEY_ID),8.) = INPUT(CATS(B.KEY_ID),8.) 

다음 쿼리를 사용하면 192757 r 당신이 볼 수 있듯이 OWS

ON A.KEY_ID = PUT(B.KEY_ID,8.-L) 

, 나는 A.KEY_ID = PUT (B.KEY_ID, 8.)을 사용하는 경우에만, 그것은, 그러나 테이블 A. 모든 행을 인 192,923 행을 반환 테이블 B에서 해당 key_ids를 찾지 못하며 최종 결과에 null 값을 반환합니다.

+0

대부분의 A.KEY_ID에는 선행 공백이 저장된 7 자리 문자열이 없지만 8. 형식의 PUT() 함수는 10,000,000보다 작은 숫자의 선행 공백을 생성합니다. – Tom

+0

@ 톰 - 그건 내 생각이기도하지만 OP는 조인 기준에서 공백을 제거 할 때 작동하지 않는다고 말합니다. – vknowles

답변

0

정수에 대해 이야기하는 경우 값을 숫자로 변환하고 비교하는 것이 좋습니다. 동일한 정보를 사용하여 7 개의 문자열과 8 개의 문자열을 읽을 수 있습니다.

input(a.char_key_id,8.) = b.num_key_id 

왜 문제가 발생했는지는 문자 버전에서 공백 및/또는 선행 0이 원인 일 수 있습니다. SAS 비교는 뒤 공백을 무시하므로 걱정할 필요가 없습니다. 제로

를 선도

이 더 큰 문제입니다. 대부분의 입력 메소드가 선행 공백을 제거하기 때문에 선행 공백보다 선행 0을 갖는 문자 변수를 볼 확률이 높습니다. 그러나 앞에 0이 있으면 같은 정수 값을 갖는 을 여러 문자로 나타낼 수 있습니다. 따라서 123을 '123', '0123', '00123'등으로 나타낼 수 있습니다. 이렇게하면 병합 할 수있는 것 이상의 문제가 발생합니다. 당신이 문자열로 정수를 변환 할 때

앞 공백

이 더 가능성이 문제가 될 것입니다. PUT() 함수는 일반적으로 값을 오른쪽 정렬합니다 (따라서 선행 공백을 생성 함) 반면에 대부분의 입력 방법은 왼쪽 정렬 된 값 (뒤 공백)으로 끝납니다. 따라서 정수 12345를 put(12345,8.)을 사용하는 문자열로 변환하면 3 개의 선행 공백 ' 12345'이 생기며 후행 공백이있는 문자 변수 '12345 '의 값과 일치하지 않습니다. 형식에 정렬 명령을 추가 할 수 있습니다. 다시 SAS는 후행 공백을 무시하기 때문에 더 긴 형식을 사용할 수 있습니다.

put(b.num_key_id,F8.-L) = a.char_key_id 

지금 당신은 당신의 변수는 숫자 또는 문자이고, 당신은 당신이 문자로 다시 숫자로 변환하기 위해이 같은 것을 사용하는 것보다 하나를 위해 일할 수있는 코드를 여부를 모르는 경우. SAS가 BEST12를 사용하기 때문에 정수가 12 자리로 표시 될 수있는 것보다 큰지 조심하십시오. 형식을 사용하여 숫자를 변환하십시오.

input(cats(a.key_id),8.) = input(cats(b.key_id),8.) 
+0

우리와 함께 모든 정보를 공유해 주셔서 감사합니다. 나는 당신이 제안한 것들을 시도했다. 그것은 내가 기대 한 것을주지 않았다. 나는 상세한 결과를 당신과 공유 할 것이며 아마도 잘못된 방향을보고있을 것입니다. 고맙습니다! –

+0

일치해야하는 몇 가지 예제 값을 표시하십시오. 또한 문자열에 공백 외에 다른 "보이지 않는"문자가있어 값이 동일하지만 다르게 표시 될 수도 있습니다. – Tom

+0

내가 왜 A.KEY_ID = PUT (B.KEY_ID, 8)을 사용할 때 반환 된 정확한 정보를 얻을 수 없었는지 알 것 같습니다. 너무 창피합니다. 나는 이것이 B.EXP_DT NULL이라는 질의 끝에 제약이 있기 때문에 그것이라고 믿는다. 쿼리를 두 부분으로 나눠 보았습니다. 먼저 exp_dt가 null 인 테이블 B의 또 다른 버전을 만든 다음 A와 B를 결합한 상태로 남겨 둡니다. 처음에 정보를 빠뜨 렸기 때문에 발생하는 혼란에 대해 유감스럽게 생각합니다 (관련이 없으며 내가 실행 한 쿼리의 필수 부분 만 보여주고 싶다고 생각했습니다). –

0

당신의 필요를 이해한다면, 유일한 문제는 키의 문자열 버전을 비교하는 것입니다. 숫자판은 INPUT으로 시도해 보았습니다.문자열 키에 대한 그래서

, 이것은 나를 위해 일한 것입니다 :

a.key_id = trim(left(put(b.key_id,8.))) 

당신은 간단하게 할 수로 :

a.key_id = compress(put(b.key_id,8.)) 

문제는 문자열 키 값에 공백이있는 곳 것으로 보인다 . 당신은 양쪽에서 그것을 제거해야 할 수도 있습니다.

+0

안녕하세요, 귀하의 의견을 보내 주셔서 감사합니다. 나는 당신이 제공 한 것을 시도해 보았고, 나는 a.key_id = put (a.key_id, 7.)을 실행했을 때와 같은 결과를 리턴했다. –

+0

죄송합니다. 질문을 잘 설명하지 않으 셨습니다. 나는 그것을 바꾸려고 노력할 것이다. 내가 일치하는 key_id는 7 자리 또는 8 자리입니다. 처음에는 쿼리 a.key_id = put (a.key_id, 7.)을 사용했지만 key_id가 8 자릿수 인 모든 레코드가 일치하는 것을 찾을 수 없었습니다. 그런 다음 쿼리 a.key_id = put (a.key_id, 8.)을 사용했지만 7 자리가 모두 일치하지 않습니다. 나는 왜 이것을 해결할 해결책을 찾고 있는지 잘 모르겠습니다. –

+0

이것을 사용하면 어떻게됩니까? 'compress (a.key_id) = compress (put (b.key_id, 8..))' – vknowles