1) find와 xargs를 이용하여 찾는 법

[test:/usr]$ find . | xargs grep 홍길동

=> 현재 디렉토리 내 모든 파일들을 중에서 "홍길동"이라는 문자열을 갖고 있는 파일의 한 줄과 이름을 보여준다.


[test:/usr]$ find . -name "*.txt" | xargs grep 홍길동

=> 현재 디렉토리 내 확장자가 txt인 파일들을 중에서 "홍길동"이라는 문자열을 갖고 있는 파일의 한 줄과 이름을 보여준다.


[test:/usr]$ find . -name "*.txt" | xargs grep --color=auto 홍길동

=> 검색어로 사용된 문자열은 색을 달리하여 표시


[test:/usr]$ find . -name "*.txt" | xargs grep -n 홍길동

=> 검색어의 위치(줄번호)를 같이 표기


[test:/usr]$ find . -name "*.txt" | xargs grep -i LgMobile

=> 대소문자를 구분하지 않음


[test:/usr]$ find . -name "*.txt" | xargs grep -l 홍길동

=> 현재 디렉토리 내 확장자가 txt인 파일들을 중에서 "홍길동"이라는 문자열을 갖고 있는 파일의 이름만 출력


grep: [특정경로]: No such file or directory 와 같은 메시지가 포함된다면 2>/dev/null 을 추가하면 해당 메시지를 표시하지 않고 찾은 결과만 볼 수 있다. 즉,

[test:/usr]$ find . | xargs grep 2>/dev/null 홍길동


모든 옵션은 함께 사용 가능하다.

[test:/usr]$ find . -name "*.txt" | xargs grep --color=auto -n 2>/dev/null 홍길동


2) grep을 이용하여 찾는 법

grep 명령은 파일 내에서 지정한 패턴이나 문자열을 찾은 후에, 그 패턴을 포함하고 있는 모든 행을 표준 출력해 준다.


* grep 명령의 기본 문법 : grep [-옵션] 패턴 파일명


grep의 option은 아래와 같다.

* -c : 패턴이 일치하는 행의 수를 출력

* -i : 비교시 대소문자를 구별 안함

* -v : 지정한 패턴과 일치하지 않는 행만 출력

* -n : 행의 번호를 함께 출력

* -l : 패턴이 포함된 파일의 이름을 출력

* -w : 패턴이 전체 단어와 일치하는 행만 출력


문자열은 아래와 같이 찾으면 된다.


[test:/usr]$ grep -n '삼성' token_dic

=> token_dic 이라는 파일내에서 '삼성' 이라는 패턴이 들어간 문자열과 행번호를 출력


[test:/usr]$ grep -l '삼성' *

=> 현재 디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어간 파일의 이름을 출력


[test:/usr]$ grep -v '삼성' *

=> 현재 디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어가지 않은 행을 출력


[test:/usr]$ grep -r '삼성' *

=> 현재 디렉토리 및 서브디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어간 문자열 출력


grep으로 파일 내의 문자열을 찾을 때 정규 표현식(Regular Expression)을 사용할 수 있다. 패턴 지정에서 사용되는 정규 표현식은 작은 따옴표 (' ')로 묶어서 표현한다.


[test:/usr]$ grep '^a' 파일명

=> ^는 파일의 시작을 나타냄. 파일에서 a로 시작하는 행을 찾는다.


[test:/usr]$ grep 'apple[test:/usr]$' 파일명

=> [test:/usr]$는 파일의 끝을 나타냄. 파일에서 e로 끝나는 행을 찾는다.


[test:/usr]$ grep 'app*' 파일명

=> 파일에서 app로 시작하는 모든 단어를 찾는다.


[test:/usr]$ grep 'a.....e' 파일명

=> 파일에서 a로 시작하고 e로 끝나는 7자리 단어를 찾는다.


[test:/usr]$ grep [a-d] 파일명

=> 파일에서 a,b,c,d 로 시작하는 단어를 모두 찾는다.


[test:/usr]$ grep [aA]pple 파일명

=> 파일에서 apple 또는 Apple로 시작하는 단어를 모두 찾는다.


[test:/usr]$ grep 'apple' d*

=> d로 시작하는 모든 파일에서 apple 를 포함하는 모든 행을 찾는다.


[test:/usr]$ grep 'apple' 파일명1 파일명2

=> 지정된 두개의 파일에서 apple 를 포함하는 모든 행을 찾는다.


[test:/usr]$ grep '^[ab]' 파일명

=> 파일에서 a나 b로 시작되는 모든 행을 찾는다.


select * into new_table

from old_table


oracle(8i)은?



create table new_table as select * from old_table


오라클로 되어 있는 SQL문을 MS SQL Server 버전으로 변경해야 할 필요가 있거나 그 반대의 경우, 때에 따라 상당히 복잡한 작업이 들어가게 된다. 변경해야 할 오라클 SQL문이 ANSI 표준에 준하다면 그런대로 괜찮다.


우선 아래 내용대로 찾아 바꾼다. (텍스트에디터 이용)

오라클MS SQL 
||
FROM DUALFROM절 삭제
LENGTHLEN
MOD
SYSDATEGETDATE() 
NVL(a, b)ISNULL(a, b) 
TO_CHAR(날짜, 'YYYY-MM-DD')CONVERT(VARCHAR(10), 날짜, 120) 
TO_DATE(문자열)CONVERT(DATETIME, 문자열) 


 여기까지는 간단하다. 문제는 이 다음, 커서(Cursor)나 MINUS, CONNECT BY 구문이 포함될 경우다.

나머지는 출처에서 확인

1. Cursor

오라클 버전의 Cursor 사용법은 아래와 같다.
--------------------------------------------------------------------------
CURSOR user_list IS
(
SELECT user_id, user_name
   FROM T_USR

FOR cur_user IN user_list
LOOP
INSERT INTO T_MBR VALUES(cur_user.user_id, cur_user.user_name);
END LOOP;
--------------------------------------------------------------------------

이를 MS SQL 버전으로 옮기면
--------------------------------------------------------------------------
DECLARE user_list CURSOR FOR
SELECT user_id, user_name
  FROM T_USR
          
OPEN user_list
FETCH NEXT FROM user_listINTO @v_id, @v_name
WHILE(@@FETCH_STATUS = 0)
BEGIN
INSERT INTO T_MBR VALUES(@v_id, @v_name)
FETCH NEXT FROM rec INTO @v_id, @v_name
END
CLOSE user_list
DEALLOCATE user_list
--------------------------------------------------------------------------
 
 
2. sys_connect_by_path(), START WITH ~ CONNECT BY ~

오라클에서 상당히 편리하게 사용되는 계층구조 쿼리 구문도 MS SQL에서는 다른 방식으로 구현해야 한다.
--------------------------------------------------------------------------
SELECT SUBSTR(user_name, 4) AS user_name
  FROM (SELECT user_id
       user_name as,
       sys_connect_by_path (user_name, ' > ' ) AS user_name
          FROM T_USR
 START WITH manager_id = 0 CONNECT BY PRIOR user_id = manager_id
       ) A
--------------------------------------------------------------------------

이를 CTE 재귀호출 방식을 이용하여 MS SQL 버전으로 옮기면
--------------------------------------------------------------------------
WITH TBL_PARENT AS 
( SELECT user_id, manager_id, 
               CONVERT(VARCHAR(100), CAST(user_name AS VARCHAR(100)) + ' > ') AS user_name
    FROM T_USR 
   WHERE manager_id = 0 
   UNION ALL
  SELECT user_id, manager_id,
               CONVERT(VARCHAR(100), B.navi + 
                                          CAST(a.user_name AS VARCHAR(100)) + ' > ') AS user_name
    FROM T_USR  A 
     INNER JOIN TBL_PARENT B 
        ON A.manager_id = B.user_id
SELECT user_id, manager_id,
             SUBSTRING(navi, 1, LEN(navi)-2) navi
   FROM TBL_PARENT
-------------------------------------------------------------------------- 


3. MINUS

사실 앞서 설명한 커서나 계층쿼리를 컨버전하는 것보다 이 마이너스 연산이 더 복잡하다. 왜냐하면 커서와 계층구조 같이 일정한 패턴보다는 원하는 결과를 얻기 위해 약간 더 섬세한 조건절 조정이 필요한 경우가 있기 때문이다. 핵심은 오라클의 마이너스 연산은 두 개의 SELECT문 결과집합에서 완전히 동일한 레코드를 첫 번째 결과 집합에서 제외한다는 것이다.

-------------------------------------------------------------------------- 
SELECT  user_id, user_name
   FROM  T_USR
 WHERE  dept_id = 'D001'
MINUS
SELECT  user_id, user_name
   FROM  T_USR
 WHERE  manager_id = 100
-------------------------------------------------------------------------- 

이를 NOT EXISTS를 이용하여 MS SQL 구문으로 옮기면
-------------------------------------------------------------------------- 
SELECT  user_id, user_name
   FROM  T_USR  X
 WHERE  NOT EXISTS (
                    SELECT   1
                        FROM  T_USR  Y
                      WHERE   ISNULL(X.user_id, '') = ISNULL(Y.user_id, '')
                          AND   ISNULL(X.user_name, '') = ISNULL(Y.user_name, '')
              )
      AND  dept_id = 'D001'
--------------------------------------------------------------------------  
여기서 중요한 점은 NOT EXISTS 안에 있는 서브쿼리의 WHERE 절에서 바깥쪽 테이블에서 SELECT하는 모든 컬럼을 일일이 서브쿼리 테이블의 컬럼값과 비교해야 한다는 것이다. (오라클의 MINUS는 모든 컬럼이 동일한 레코드를 제외하기 때문) 그리고 NULL끼리는 비교가 불가하기 때문에 ISNULL 함수를 사용해 처리하였다. 2008 버전부터는 EXCEPT 연산을 MINUS 대신 사용 가능하다.


4. DECODE

CASE WHEN ~ ELSE ~ END 문과 결과는 동일하지만 사용법상의 단순함으로 인해 많이 사용되는 DECODE 함수는 말 그대로 CASE 문으로 변경해주면 된다.
-------------------------------------------------------------------------- 
SELECT  DECODE(user_id, 'A', 'B', 'C')
   FROM  T_USR
-------------------------------------------------------------------------- 

MS SQL에서는 아래와 같이 쓸 수 있겠다. (동일하게 오라클에서도 사용 가능하다)
-------------------------------------------------------------------------- 
SELECT  CASE WHEN user_id = 'A' THEN 'B'
                       ELSE 'C'
              END
   FROM  T_USR
--------------------------------------------------------------------------  

출처 : http://mysaga.tistory.com/209


+ Recent posts