SELECT (1.FIELD NAME) FROM (2.TABLE NAME)
INTO (3.DATA OBJECT)
WHERE (4.FIELD NAME) 비교연산자 (DATA OBJECT/VALUE)
그럼 이제는 Where 4.field name에 대해서 생각해보도록 합시다. WHERE조건문은 실제적으로 SELECT구문에 사용되어지는 메인은 아닙니다. 단지 좀 더 정확한 데이터를 얻기 위해서, 좀 더 간결한 데이터를 얻기 위해서 사용하는 부가적인 구문이라고 말 할수 있습니다. 그리고 WHERE조건문은 SELECT뿐만 아니라 UPDATE, DELETE구문에도 적용이 가능합니다.
기본적으로 WHERE구문을 사용하게 되면 그 다음에는 바로 Field name이 위치하게 됩니다. 이 field는 반드시 FROM에서 가져오는 TABLE/VIEW에 위치한 필드여야 함은 당연하겠지만, INTO구문에 오는 데이터가 담기는 부분의 field와는 반드시 같을 필요는 없습니다. 그럼 왜 Field name만 올 수 있을까요? 검색을 위한 최소의 조건이자 데이터가 담기는 하나의 최소단위이기 때문입니다. field name 다음에는 이 필드와 비교할 대상이 위치하며 그 사이에 두 대상의 비교 및 검색조건이 위치하게 됩니다. 비교할 대상은 field의 값이 담긴 Value일 수도 있고 value가 여러개 담긴 table형태의 data object일 수도 있습니다.
1. WHERE condition : 가장 기본적인 WHERE조건의 형태입니다. 우리들은 field의 조건을 비교연산자를 사용하여 비교대상과 동일한 field조건만을 추출하여 select구문에 적용시킬 수 있습니다. 아래 예에서는 value값이 들어가기에 비교 연산자로 EQ(=)를 사용하였지만 internal table이라는 data objects와 비교하게 되면 보통 IN이라는 비교연산자를 사용하게 됩니다.
예문)
DATA : wa_spfli type spfli.
SELECT * FROM spfli INTO wa_spfli
WHERE carrid = 'LH'.
itab의 record를 SELECT구문의 조건으로 활용한다는 의미이다. 주로 WHERE조건을 여러개 주어야 하는 상황에서 필드의 값이 여러개 담긴 data object구문을 적용하기 힘들때 itab형태에 조건문을 담아서 사용하고자 할 경우에 쓰여집니다만, 너무나 제약조건이 많고, Performance도 좋은편이 아니기에(itab의 record수마다 LOOP구문을 탄다라고 생각하면 된다.) 보통 subquery로 구현하는 방법을 사용합니다.
제약조건 : LIKE,BT,IN등의 비교구문이 사용불가능하다.
: IN뒤에 오는 itab의 경우 header가 필요하지 않다.
: 사용시, order by구문과 having구문을 사용할 수 없다.
: itab에 Record전체 값이 중복된 값이 있으면 하나만 남는다.
: itab뒤에 오는 WHERE조건에 필요한 field의 경우 itab에 있는 field만 가능하다.
아래의 예문1과 예문2는 동일한 데이터를 출력하는 구문이며 예문1의 FOR ALL ENTRIES를 쓰지 않는다면 똑같이 데이터를 뽑아오기 위해서 예문2 구문처럼 작성해야 한다는 뜻이다.
예문1)
SELECT * FROM sflight INTO wa_sflight
FOR ALL ENTRIES IN ftab
WHERE CARRID = ftab-carrid AND
CONNID = ftab-connid AND
FLDATE = '20010228'.
예문2)
SELECT DISTINCT * FROM sflight INTO wa_sflight
WHERE ( carrid = 'LH' AND connid = '2415' AND fldate = '20010228' )
OR ( carrid = 'SQ' AND connid = '0026' AND fldate = '20010228' )
OR ( carrid = 'LH' AND connid = '0400' AND fldate = '20010228' ).
3. WHERE (source_text) : 이런 구문은 자주 사용하지는 않지만 검색조건 자체를 변수화 시켜서 재사용할 수 있다는 것이 장점이다. 유저가 입력한 변수값을 바탕으로 검색조건을 만들어 사용하기 때문에 좀 더 다이내믹한 변수를 만들어낼 수 있다.
예문)
PARAMETERS: airline(2) TYPE C,
date TYPE D.
DATA: where_clause TYPE STRING,
connid TYPE sflight-connid.
CONCATENATE 'carrid = ''' airline ''''' AND fldate = ''' date '''' INTO where_clause. <-검색조건설정
SELECT connid FROM sflight INTO connid
WHERE (where_clause). <- ()안에 조건문 넣음
ENDSELECT.
캄사해요~ 너무 필요한 정보예요