본문 바로가기
통계프로그램 비교 시리즈/프로그래밍비교(Oracle,Python,R,SAS)

[문자 함수] 문자열에서 문자 검색 - 문자 검색 함수(Instr 함수) - 127 (오라클 SQL, R, Python, SAS)

by 기서무나구물 2022. 12. 16.

포스팅 목차

     

    127. Display those employees whose name contains “A”?

     

    * 이름에 영문자 “A”가 포함된 직원들의 정보를 출력하시오.


    • Oracle : Instr 함수, Like
    • 파이썬 Pandas : .str.contains()
    • R 프로그래밍 : %like%
    • R Dplyr Package : %like%
    • R sqldf Package : Like 연산자, Instr 함수
    • Python pandasql Package : Like 연산자, Instr 함수
    • R data.table Package : %like%
    • SAS Proc SQL : index 함수, Find 함수, Scan 함수
    • SAS Data Step : index 함수, Find 함수, Scan 함수
    • Python Dfply Package : .str.contains()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    instr 함수를 사용하여서 사원명(‘ename’)의 첫 번째 문자에서 검색을 시작하여서 대문자 ‘A’가 첫 번째로 검색되는 위치를 확인 한 후 0 보다 큰(검색된 경우) 경우에 해당하는 직원들의 정보를 출력한다.

    Oracle Programming
    select * 
    from   emp 
    where  instr(ename,'A',1,1)>0;

     


    like 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.

     

    Oracle Programming
    select * 
    from   emp 
    where  ename like ('%A%')

     


    2. Python Pandas(파이썬)

    contains 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.

     

    Python Programming
    emp[ emp['ename'].str.contains("A") ].head()

     

    Results
      empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10

     


    3. R Programming (R Package)

    %like% 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.

     

    R Programming
    %%R
    
    emp[ emp$ename %like% 'A' ,]

     

    Results
    # A tibble: 4 x 8
      empno ename job       mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>   <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7369 SMITH CLERK    7902 1980-12-17   800    NA     20
    2  7788 SCOTT ANALYST  7566 1982-12-09  3000    NA     20
    3  7900 JAMES CLERK    7698 1981-12-03   950    NA     30
    4  7902 FORD  ANALYST  7566 1981-12-03  3000    NA     20

     


    4. R Dplyr Package

    %like% 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.

     

    R Programming
    %%R
    
    emp %>% filter( ename %like% "A" )

     

    Results
    # A tibble: 7 x 8
      empno ename  job        mgr hiredate     sal  comm deptno
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30
    2  7521 WARD   SALESMAN  7698 1981-02-22  1250   500     30
    3  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30
    4  7698 BLAKE  MANAGER   7839 1981-03-01  2850    NA     30
    5  7782 CLARK  MANAGER   7839 1981-01-09  2450    NA     10
    6  7876 ADAMS  CLERK     7788 1983-01-12  1100    NA     20
    7  7900 JAMES  CLERK     7698 1981-12-03   950    NA     30

     


    5. R sqldf Package

    like 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’를 포함하고 있는 직원들의 정보를 출력한다.

     

    R Programming
    %%R
    
    sqldf(" select * 
            from   emp 
            where  ename like ('%A%'); ")

     

    Results
      empno  ename      job  mgr   hiredate  sal comm deptno
    1  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30
    2  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30
    3  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30
    4  7698  BLAKE  MANAGER 7839 1981-03-01 2850   NA     30
    5  7782  CLARK  MANAGER 7839 1981-01-09 2450   NA     10
    6  7876  ADAMS    CLERK 7788 1983-01-12 1100   NA     20
    7  7900  JAMES    CLERK 7698 1981-12-03  950   NA     30

     


    instr 함수를 사용하여서 사원명(‘ename’)의 첫 번째 문자에서 검색을 시작하여서 대문자 ‘A’가 첫 번째로 검색되는 위치를 확인 한 후 0 보다 큰(검색된 경우) 경우에 해당하는 직원들의 정보를 출력한다.

    R Programming
    %%R
    
    sqldf(" select * 
            from   emp 
            where  instr(ename,'A') > 0 ")

     

    Results
      empno  ename      job  mgr   hiredate  sal comm deptno
    1  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30
    2  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30
    3  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30
    4  7698  BLAKE  MANAGER 7839 1981-03-01 2850   NA     30
    5  7782  CLARK  MANAGER 7839 1981-01-09 2450   NA     10
    6  7876  ADAMS    CLERK 7788 1983-01-12 1100   NA     20
    7  7900  JAMES    CLERK 7698 1981-12-03  950   NA     30

     


    6. Python pandasql Package

     

    Python Programming
    ps.sqldf(" select * from emp where ename like ('%A%'); ").head()

     


    Results
      empno ename job mgr hiredate sal comm deptno
    0 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    1 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    2 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    3 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    4 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10

     


    Python Programming
    ps.sqldf(" select * from emp where instr(ename,'A')>0 ").head()

     

    Results
      empno ename job mgr hiredate sal comm deptno
    0 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    1 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    2 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    3 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    4 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10

     


    7. R data.table Package

    %like% 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.

     

    R Programming
    %%R
    DT          <- data.table(emp)
    
    DT[ ename %like% "A", ]

     

    Results
       empno  ename      job  mgr   hiredate  sal comm deptno
    1:  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30
    2:  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30
    3:  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30
    4:  7698  BLAKE  MANAGER 7839 1981-03-01 2850   NA     30
    5:  7782  CLARK  MANAGER 7839 1981-01-09 2450   NA     10
    6:  7876  ADAMS    CLERK 7788 1983-01-12 1100   NA     20
    7:  7900  JAMES    CLERK 7698 1981-12-03  950   NA     30

     


    8. SAS Proc SQL

    • Index 함수와 Find 함수
    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select a.*,
               index(ename,'A')  as index_A,
               find(ename,'A',3) as index_A_2
        from   emp a
        where  index(ename,'A')>0;
    QUIT;
    PROC PRINT Data=STATSAS_1(Drop=job hiredate comm);RUN;

     

    Results
    OBS empno ename mgr sal deptno index_A index_A_2
    1 7499 ALLEN 7698 1600 30 1 0
    2 7521 WARD 7698 1250 30 2 0
    3 7654 MARTIN 7698 1250 30 2 0
    4 7698 BLAKE 7839 2850 30 3 3
    5 7782 CLARK 7839 2450 10 3 3
    6 7876 ADAMS 7788 1100 20 1 3
    7 7900 JAMES 7698 950 30 2 0

     


    • [참고] Scan 함수
    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select a.*,
               scan(ename, 1,'A') as fir,
               scan(ename, 2,'A') as sec,
               scan(ename, 3,'A') as thr
        from   emp a
        where  index(ename,'A') > 0;
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno fir sec thr
    1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 LLEN    
    2 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 W RD  
    3 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 M RTIN  
    4 7698 BLAKE MANAGER 7839 1981-03-01 2850 . 30 BL KE  
    5 7782 CLARK MANAGER 7839 1981-01-09 2450 . 10 CL RK  
    6 7876 ADAMS CLERK 7788 1983-01-12 1100 . 20 D MS  
    7 7900 JAMES CLERK 7698 1981-12-03 950 . 30 J MES  

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    DATA STATSAS_3;
     SET EMP;
         index_A   = index(ename,'A');
         index_A_2 = find(ename,'A',3); /* 3번째 자리 이후 */
         Drop job hiredate comm;
         where  index(ename,'A')>0;
    RUN;
    PROC PRINT;RUN;

     

    Results
    OBS empno ename mgr sal deptno index_A index_A_2
    1 7499 ALLEN 7698 1600 30 1 0
    2 7521 WARD 7698 1250 30 2 0
    3 7654 MARTIN 7698 1250 30 2 0
    4 7698 BLAKE 7839 2850 30 3 3
    5 7782 CLARK 7839 2450 10 3 3
    6 7876 ADAMS 7788 1100 20 1 3
    7 7900 JAMES 7698 950 30 2 0

     


    10. Python Dfply Package

     

    Python Programming
    emp >> filter_by( X.ename.str.contains("A") )

     

    Results
      empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    10 7876 ADAMS CLERK 7788.0 1983/01/12 1100 NaN 20
    11 7900 JAMES CLERK 7698.0 1981/12/03 950 NaN 30

     


    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE]   SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트

    반응형

    댓글