전산실짬밥/Oracle2013. 8. 21. 14:31

아래와 같은 쿼리가 있다. 이게 2가지면 아래처럼 보이고 100개면 or 를 그 수만큼 계속 해서 써야된다.

 

select * from 테이블명
where 필드명 like ('%편지지%')
or 필드명 like ('%고양이%')

 

 

그럼 아래와 같이 in 을 쓰면 되지 않을까?

하지만 직접 해보면 안되는 것을 알 수 있다.


select * from 테이블명
where 필드명 like in ('%편지지%', '%고양이%')

 

 

 

방법은 regexp_like 를 아래와 같이 사용하면 된다.


select * from 테이블명
where regexp_like(필드명,'편지지|고양이')

Posted by 정훈승
전산실짬밥/Oracle2013. 2. 21. 11:34

실제 DB와 개발용 DB를 따로 두는 경우 발생하는 일이다.

실제 DB는 데이터가 지금 이 순간에도 계속쌓이고 있다.

개발용 DB의 시퀀스가 당연히 실제 DB의 시퀀스보다 낮다.

 

개발을 하기 앞서 실제 DB와 개발용 DB의 싱크를 맞춰야 한다.

이 과정에서 시퀀스정보가 누락되는 경우가 있는데 이때 시퀀스를 맞춰주지 않으면

개발환경에서 에러가 난다.

 

테이블명이 ADMIN_LOG

시퀀스 명이 ADMINLOG_IDX 라고 치자.

 

select (select max(idx) ADMIN_LOG from dual)-ADMINLOG_IDX.nextval from dual;

위와 같이 입력해주면 얼마만큼의 차이가 나는지 값이 나온다.

 

만약 160445 의 값이 나왔다면

 

alter sequence ADMINLOG_IDX increment by 160445;

 

select ADMINLOG_IDX.nextval from dual;

 

alter sequence ADMINLOG_IDX increment by 1;

이렇게 차례대로 날려주면된다.

Posted by 정훈승
전산실짬밥/Oracle2012. 7. 25. 14:53

기본적인 시간 출력은

select sysdate from dual; 이다.

 

내일은

select sysdate+1 from dual; 이라고 표현한다.

 

반대로 어제는 sysdate-1 from dual; 이라고 표현한다.

 

 

한시간 후 또는 3분후 이런건 어떻게 표현할까?

 

한시간 후는

select sysdate+1/24 from dual; 이라고 표현한다.

하루가 24시간이기 때문이다.

 

3분 후는

select sysdate+3/1440 from dual; 이라고 표현한다.

하루가 1440분이기 때문이다.

Posted by 정훈승
전산실짬밥/Oracle2012. 7. 2. 16:52

select lengthb('정훈승') from dual

 

위 sql문을 던질때 차이가 있다.

데이터베이스의 문자셋(charset)이 euc-kr인 경우에는 6을 반환하고

utf-8인 경우에는 9를 반환한다.

 

utf-8(유니코드) 일때는 한글 한글자가 3바이트랑께!!

 

그니까 varchar2 속성으로 필드생성할 때 한글을 입력받기 위한 필드라면 곱하기 3을 해줘야 된다.

 

 

※ length 함수는 단순히 글자의 수를 반환하고, lengthb 함수는 바이트 수를 반환한다.

Posted by 정훈승
전산실짬밥/Oracle2012. 1. 4. 10:44
select * from (
    select name, age, sex, phone, email, score

    from member
    order by score
)
where rownum <= 100


위와 같은 쿼리를 날리면
member 테이블에서 score를 기준으로 100명을 뽑는다.

member 테이블에 약 5만명정도 들어있다고 치자. 근데 여기서 랜덤으로 100명만 뽑고 싶다!
그럼 어떻게 해야되는가? (새로고침할때마다 바뀌게)

select * from (
    select MOD(ABS(DBMS_RANDOM.RANDOM),50000) as jhs, name, age, sex, phone, email, score

    from member
    order by jhs
)
where rownum <= 100


요렇게 하면 랜덤으로 100명 뽑는다. 물론 새로고침할때마다 바뀐다.






이걸 응용해서 로또 알고리즘을 만들 수 있다.
테이블에 no라는 필드를 만들고 1부터 46까지 데이터를 넣는다.

create table lotto_table
(
    no number(2)
);

begin
    insert into lotto_table values (1);
    insert into lotto_table values (2);
    insert into lotto_table values (3);
    insert into lotto_table values (4);
    insert into lotto_table values (5);
    (중간생략)
    insert into lotto_table values (46);
end;

그 다음에

select * from (
    select MOD(ABS(DBMS_RANDOM.RANDOM),46) as jhs, no

    from lotto_table
    order by jhs
)
where rownum <= 6


이렇게 하면 또 하나의 로또 알고리즘 완성!

이걸 잘 활용하면 써먹을 때가 많다.
난 이걸 기반으로 우리 회사 전산추첨 알고리즘을 짰다.
Posted by 정훈승
전산실짬밥/Oracle2012. 1. 4. 10:29

8i버전에서는 left, right함수가 먹었고
또한 자동으로 order by 가 primary key로 잡혔다.
getDate라던지 어쨋든 visual basic에서나 쓸법한 그런 문법들이 허용되었었다.

11g에서는 left, right 같은 visual basic문법이 허용되지 않고
order by가 필요한 select문에서는 반드시 따로 order by를 해줘야 한다.

정말 편하게 생각했던 left, right함수는 모두 substr로 고쳐줘야 한다.
문자열의 길이가 일정하다면 right함수 역시 substr로 바꿀 수 있지만
문자열의 길이가 일정하지 않은 right함수는 좀 골치거리가 될 것이다.

날짜관련 문법은 모두 sysdate를 기반으로 하여 to_char와 to_date를 써야 한다.
Posted by 정훈승