포스팅 목차
o WHERE 구문
1. 목 적
WHERE 구문은 SAS 데이터 세트에서 특정 조건에 해당하는 관측치를 선택한다. 입력 데이터 세트에서 모든 관측치를 읽을 필요가 없는 경우에, WHERE 구문을 사용하여 필요한 관측치만 읽어서 프로그램 효율성을 향상 시킬 수 있다.
WHERE 구문은 조건문에서 실행될 수 없어서 IF-THEN 구문의 일부로 사용할 수 없다. WHERE 구문은 논리 연산자로 연결된 다중 WHERE 표현식을 사용할 수 있다.
(개별적으로 WHERE 구문을 나열하기 위하여 WHERE ALSO 옵션 사용 가능. )
데이터 세트에서 관측치 일부를 추출하기 위하여 WHERE 구문을 사용하는 경우에 SAS 데이터 세트에 인덱스(INDEX)를 생성하여서 프로그램 성능을 향상 시킬 수 있다.
2. 문 법
WHERE where-expression-1 < logical-operator where-expression-n>; |
1) where-expression
일반적으로 피연산자와 연산자로 구성되는 산술 또는 논리적 표현식을 지정한다. 또한 다중 Where-표현식을 함께 지정할 수 있다.
Tip : | 아래 세션에서 설명하는 피연산자와 연산자는 WHERE= 데이터 세트 옵션에서도 사용이 가능하다. |
Tip : | 다중 Where-표현식을 함께 지정 할 수 있다. |
2) logical-operator
논리 연산자(AND, AND NOT, OR, OR NOT 등)를 지정한다.
3) WHERE 표현식에서 사용되는 연산자
WHERE 구문에는 SAS 연산자와 특수 WHERE 표현식 연산자를 모두 사용할 수 있다. 사용 가능한 연산자의 전체 목록은 아래의 목록을 참조하라.
3. 상세 설명
기본사항
입력 데이터 세트에서 모든 관측치를 읽을 필요가 없는 경우에, WHERE 구문을 사용하여 필요한 관측치만 읽어서 프로그램 효율성을 향상시킬 수 있다.
WHERE 구문은 조건문에서 실행 될 수 없다. 즉, IF-THEN 구문의 일부로 사용 할 수 없다. WHERE 구문은 논리 연산자로 연결된 다중 WHERE 표현식을 사용 할 수 있다.
(개별적으로 WHERE 구문을 나열하기 위하여 WHERE ALSO 옵션 사용 가능. )
참고 : | 데이터 세트에서 관측치의 일부를 추출하기 위하여 WHERE 구문을 사용하는 경우에 SAS데이터 세트에 인덱스(INDEX)를 생성하여서 프로그램 성능을 향상 시킬 수 있다. 인덱스가 존재하는 데이터 세트에서 WHERE 표현식 처리 방안에 대하여 SAS Language Reference 에서 "Understanding SAS Indexes" 참조. |
데이터 스텝에서
WHERE 구문은 앞부분에서 지정한 SET, MERGE, MODIFY, UPDATE 구문에 나열된 모든 데이터 세트에 적용되고, WHERE 구문에서 사용되는 변수는 나열된 모든 데이터 세트에 존재해야 한다. SET 구문과 MODIFY 구문에서 POINT=옵션과 WHERE 구문을 함께 사용 할 수 없다.
WHERE 구문을 실행하면서 OBS=와 FIRSTOBS= 옵션을 함께 처리 할 수 있다. 좀 더 상세한 정보는 SAS Language Reference: Concepts 에서 "Processing a Segment of Data That Is Conditionally Selected" 를 참조.
원시(Raw) 데이터를 소유한 외부 파일에서 레코드를 선택하는 데이터 스텝이나 DATALINES 구문을 사용하여 내부 데이터를 읽는 데이터 스텝에서 WHERE 구문을 함께 사용 할 수 없다.
데이터 스텝의 개별 반복을 실행하는 중에, SET, MERGE, MODIFY 또는 UPDATE 구문의 개별 실행 과정에서 첫 번째로 수행하는 작업은 입력 데이터 세트의 관측치가 WHERE 구문의 조건에 해당하는지 여부를 확인하는 것이다. WHERE 구문은 입력 데이터 세트 옵션이 적용된 이후와 데이터 스텝에서 다른 SAS 구문이 실행되기 전에 적용된다. 만약 데이터 스텝이 MERGE, MODIFY 또는 UPDATE 구문과 WHERE 구문을 함께 사용하여 관측치를 결합하면, 개별 데이터 세트에서 WHERE 구문에 해당하는 관측치를 먼저 선택하여 관측치 결합 작업을 수행한다.
데이터 스텝에서 WHERE과 BY 구문
데이터 스텝이 WHERE 구문과 BY 구문을 함께 실행하면, WHERE 구문은 BY 그룹을 적용하기 전에 실행된다. 그러므로, BY 그룹은 원본 입력 데이터 세트의 관측치에 대하여 BY 그룹을 생성하는 것이 아니라, WHERE 구문에 의하여 선택된 관측치의 하위집합에 대하여 관측치의 그룹을 생성한다. 좀 더 상세한 정보는 SAS Language Reference: Concepts 에서 "By-Group Processing in SAS Programs” 를 참조.
PROC 스텝에서
SAS 데이터 세트를 사용하는 SAS 프로시져에서 WHERE 구문을 사용 할 수 있다. WHERE 구문은 원본 입력 데이터 중에서 프로시져로 일부 데이터를 처리하는 경우에 유용하다. 다수의 데이터 세트를 지정 할 수 있는 프로시져에서 수행되는 WHERE 구문에 대하여는 Base SAS Procedures Guide 를 참조하라. 그 외의 경우에, WHERE 구문은 이 문서처럼 작업을 수행한다.
인덱스(Index)의 사용
인덱스가 존재하는 변수를 아래 연산자 또는 함수와 함께 사용하는 경우에 데이터 또는 PROC 스텝은 데이터의 선택 작업을 최적화하기 위하여 인덱스를 사용 할 수 있다.
- BETWEEN-AND 연산자 XE "BETWEEN-AND 연산자:WHERE 구문"
- 비교연산자 (COLON 수정자 사용 가능) XE "비교연산자:WHERE 구문" XE "COLON 수정자:WHERE 구문"
- CONTAINS 연산자 XE "CONTAINS 연산자:WHERE 구문"
- IS NULL 와 IS NOT NULL 연산자 XE "IN NULL:WHERE 구문" XE "IN NOT NULL:WHERE 구문"
- LIKE 연산자 XE "LIKE 연산자:WHERE 구문"
- TRIM 함수
- 특정한 경우의 SUBSTR 함수
SUBSTR함수는 다음과 같은 인수를 필요로 한다.
where substr(variable,position,length) ='character-string';
SUBSTR함수의 인수가 다음 조건을 모두 충족한 경우에 인덱스를 사용 할 수 있다.
- position이 1
- length가 변수의 길이보다 작거나 같은 경우.
- length 가 character-string의 길이와 같은 경우
WHERE 표현식에서 사용되는 피연산자.
WHERE 표현에서 피연산자는 다음 형태 중에 하나가 될 수 있다.
- 상수
- 시간과 날짜 값
- SAS 데이터 세트에 존재하는 변수의 값
- WHERE 표현식 자체에서 생성된 값
WHERE 구문은 데이터 스텝 또는 PROC 스텝에 관측치를 가져오기 전에 실행되기 때문에, 데이터 스텝에서 생성되는 변수(예를 들어, FIRST.variable, LAST.variable, _N_, 또는 할당문에서 생성된 변수)를 WHERE 표현식에서 사용 할 수 없다. WHERE 표현식이 비교연산자를 포함하는 경우에, 변수의 출력형식(Format) 이 적용되기 전의 값이 비교 처리 작업에 사용된다.
다음은 WHERE 표현식에서 피연산자의 사용 예제이다.
- where score>50;
- where date>='01jan1999'd and time>='9:00't;
- where state='Mississippi';
다른 SAS 표현식에서 사용되는 것과 같이 수치형 변수 이름을 단독으로 사용 할 수 있다. SAS는 0 또는 결측치 값을 거짓으로, 다른 값은 참으로 처리한다. 다음 예제는 수치형 변수 EMPNUM과 SSN을 포함한 WHERE 표현식이다.
- where empnum;
- where empnum and ssn;
문자 변수에 대한 문자 상수(인용부호로 묶인 문자들) 또는 문자 변수의 이름을 WHERE 표현식에 단독으로 사용 할 수 있다. WHERE 표현식에서 문자형 변수를 단독으로 사용하면, SAS는 문자형 변수의 값이 공백이 아닌 관측치를 선택한다.
WHERE 표현식에서 사용되는 연산자
WHERE 구문에는 SAS 연산자와 특수 WHERE 표현식 연산자를 모두 사용 할 수 있다. 사용가능한 연산자의 전체 목록은 아래의 목록을 참조하라. WHERE 표현식을 평가할 때 SAS가 따르는 규칙에 대하여는 SAS Language Reference: Concepts 에서 "WHERE-Expression Processing"를 참조.
[ WHERE 구문 연산자]
1. caret (^), tilde (~), not sign (ㄱ)은 모두 동일하게 논리 연산자 NOT을 표현한다. 키보드에서 사용 가능한 문자를 사용하거나 동일한 연산기호를 사용하라. 2. OR 기호 ( | ), 분리된 세로 막대( | ), 느낌표 (!)는 모두 동일하게 논리 연산자 OR를 표시한다. 키보드에서 사용 가능한 문자를 사용하거나 동일한 연산기호를 사용하라. 3. 이중 OR 기호 (| | ), 분리된 이중 세로 막대( | | ), 이중 느낌표 (!!)은 모두 동일하게 연결 작업을 표시한다. 키보드에서 사용 가능한 문자를 사용하라. 4. 단지 문자열에서 지정된 접두사를 비교하기 위하여 비교연산자와 함께 Colon 수정자(:)를 사용 할 수 있다. |
4. 비교 사항
- SAS/FSP 소프트웨어에서 편집과 검색을 위하여 WHERE 명령어를 사용하여 데이터 일부를 선택하여 사용 할 수 있다. 프로시져에서 WHERE 구문과 WHERE= 데이터 세트 옵션을 함께 사용 할 수 있고, WHERE 명령어도 함께 사용 할 수 있다.
- SET, MERGE, MODIFY, 또는 UPDATE 구문에 다수의 데이터 세트가 지정 되었을 때, 개별 데이터 세트에서 관측치를 선택하기 위하여 WHERE= 데이터 세트 옵션을 개별 데이터 세트에 적용하라. 데이터 스텝에서, WHERE 구문과 WHERE 데이터 세트 옵션이 데이터 세트에 같이 적용되면, WHERE 구문을 무시하고 WHERE 데이터 세트 옵션이 적용된다.
- 데이터 스텝의 WHERE 구문과 분할 IF 구문의 가장 큰 차이점은 아래와 같다.
- WHERE 구문은 관측치를 프로그램 데이터 벡터(PDV)에 가져오기 전에 선택한다. 이 방식은 아주 효율적인 프로그램 기법이다. 분할 IF 구문은 관측치를 프로그램 데이터 벡터(PDV)에 모두 읽은 후에 해당하는 데이터를 선택한다.
- BY 구문이 SET, MERGE, 또는 UPDATE 구문과 함께 사용되면, WHERE 구문과 분할 IF 구문은 서로 다른 결과를 산출 할 수 있다. 분할 IF 구문은 관측치를 선택하기 전에 BY 그룹을 생성하지만 WHERE 구문은 관측치를 선택한 이후에 BY그룹을 생성하기 때문에 서로 다른 데이터 세트를 산출 할 수 있다.
- WHERE 구문은 조건적으로 실행되는 IF 구문(조건문)의 일부분으로 사용 될 수 없지만, 부분 분할 IF 구문은 조건적으로 실행되는 IF 구문(조건문)의 일부분으로 사용 될 수 있다.
- WHERE 구문은 기존에 존재하는 SAS 데이터 세트에서 관측치를 선택하지만, 분할 IF 구문은 기존에 존재하는 SAS 데이터 세트 또는 INPUT 구문으로 생성되는 관측치를 선택 할 수 있다.
- 분할 IF 구문은 검색 또는 편집을 위하여 관측치 일부를 사용하는 SAS 프로시져에서 사용 할 수 없다.
- DROP 또는 KEEP 구문과 WHERE 구문을 혼동하지 말아라. DROP 과 KEEP 구문은 처리하기 위한 변수를 선택하지만, WHERE 구문은 처리하기 위한 관측치를 선택한다.
5. 관련 구문
구문명 | 구문내용 |
DELETE 구문 | 현재 실행 중인 관측치에 대한 처리를 중지하여, 출력 데이터에서 관측치를 삭제하여 출력하지 않도록 한다. |
IF-THEN/ELSE 구문 |
지정한 조건을 만족하는 관측치에 대하여 SAS 문장을 실행한다. (IF 조건문) |
부분 분할 IF 구문 | 지정된 표현식의 조건을 만족하는 관측치에 대하여 프로그램 처리를 계속 수행한다. |
WHERE 구문 | SAS 데이터 세트에서 특정 조건에 해당하는 관측치를 선택한다. |
- SAS SQL Query Window User's Guide
- SAS/IML User's Guide
- Base SAS Procedures Guide
- "SAS Indexes" in SAS Language Reference: Concepts
- "WHERE-Expression Processing" in SAS Language Reference: Concepts
- "BY-Group Processing" in SAS Language Reference: Concepts
- Beatrous, S. & Clifford, W. (1998), "Sometimes You Do Get What You Want: SAS I/O Enhancements in Version 7," Proceedings of the Twenty-third Annual SAS Users Group International Conference, 23.
6. 예 제
예제1 : WHERE 구문의 기본 사용
다음 데이터 스텝은 CUSTOMER데이터 세트에서 NAME변수가 Mac 으로 시작하고, CITY 변수값이 Charleston 또는 Atlanta 인 관측치로 구성된 데이터 세트를 생성한다.
SAS Statements |
data testmacs;
set customer;
where substr(name,1,3)='Mac' and
(city='Charleston' or city='Atlanta');
run;
예제2 : WHERE 구문에서만 사용되는 연산자
- BETWEEN-AND 연산자
SAS Statements |
where empnum between 500 and 1000;
- CONTAINS 연산자
SAS Statements |
where company ? 'bay';
where company contains 'bay';
- IS NULL 과 IS MISSING 연산자
SAS Statements |
where name is null;
where name is missing;
- 문자 D로 시작하는 모든 관측치를 선택하기 위하여 LIKE 연산자 사용
SAS Statements |
where name like 'D%';
- 다음 이름중에서 일치하는 패턴을 찾기 위하여 LIKE연산자 사용
Diana
Diane
Dianna
Dianthus
Dyan
SAS Statements |
WHERE 구문 | 선택된 이름 |
where name like 'D_an'; | Dyan |
where name like 'D_an_'; | Diana, Diane |
where name like 'D_an__'; | Dianna |
where name like 'D_an%'; | 모든 이름을 선택 |
- "Smith"로 발음되는 이름을 선택하기 위하여 Sounds-like 연산자 사용
SAS Statements |
where lastname=*'Smith';
- SAME-AND 연산자
SAS Statements |
where year>1991;
...SAS 실행 구문...
where same and year<1999;
위 예제에서, 두 번째 WHERE 구문은 다음 WHERE 구문과 동일하다.
SAS Statements |
where year>1991 and year<1999;
[SAS Statement] SAS 데이터 스텝 구문 사전 목록] |
SAS 함수(SAS Function) 리스트 링크 |
'SAS > SAS 구문사전' 카테고리의 다른 글
【SAS Statement】 X 구문 (0) | 2022.02.08 |
---|---|
【SAS Statement】 WINDOW 구문 (0) | 2022.02.08 |
【SAS Statement】 UPDATE 구문 (0) | 2022.02.07 |
【SAS Statement】 TITLE 구문 (0) | 2022.02.07 |
[SAS Statement] SYSECHO 구문 (0) | 2022.02.07 |
댓글