FireBird Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
파이어버드 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
IBPhoenix
FireBird Main site
볼랜드포럼 광고 모집

FireBird Q&A
[1570] Re:[질문]FireBird의 SQL에서 if문 사용하기..
박지훈.임프 [cbuilder] 3461 읽음    2005-09-27 14:24
제가 쿼리문을 잘못 봤군요. select 문 다음에 if 문이 있는 것이 아니라, if 문이 select문 안에 있군요.
내용을 봐서는 아마도 조건에 따라 where절을 다르게 적용하려고 하신 거 같은데...

여러 디비에서 복잡한 쿼리를 많이 만져보지 않아서 사용하신 쿼리가 어떤 디비의 스타일인지 모르겠습니다만..
제가 알기로는 인터베이스/파이어버드에서는 조건별로 where문을 다르게 적용하는 문법은 없는 걸로 알고 있습니다.
(MS SQL에서도 그런 문법은 못본 듯 한데요)

다른 좋은 방법이 있을 거 같긴 한데, 저도 뭐 인터베이스/파이어버드 고수는 아니어서 크게 도움은 못되겠고..
일단 where문을 조건에 따라 적용하는 것이 안되므로 if문의 조건에서 경우의 수만큼 select문을 나누어야겠구요.

프로시저 안에서 union을 하실 거 같으면 인터베이스/파이어버드에서는 union 대신 다음과 같은 방법도 가능합니다.

create procedure test_union_select
returns (
    field_a integer,
    field_b integer)
as
begin
  for
    select field_a, field_b from table_a where ...
  into field_a, field_b
  do
  suspend;
  for
    select field_a, field_b from table_b where ...
  into field_a, field_b
  do
  suspend;
end

이렇게 하면 결과셋이 첫번째 select의 결과 뒤에 두번째 select의 결과가 이어져서 하나의 결과셋으로 나옵니다.
이렇게 나온 결과셋은 단순히 뒤에 붙어나오고 정렬은 안되어 있으므로, 결과셋을 정렬할 필요가 있다면,
select * from test_union_select order by field_a
이렇게 호출하면 되죠.

select에서 union을 쓰는 것과 별 차이가 없게 느껴지실 수도 있겠지만, 유니언을 붙여서 select가 복잡해지는 건 좀
막을 수 있고, 또 일단 정렬도 가능하고 하니까... ^^;;

그럼...


아폴론 님이 쓰신 글 :
: 조기 아래에서 질문하고 답변을 받았던 내용입니다. 볼랜드포럼 시샵께서도 답변해 주셨는데요...
: 제가 부족해서 받아먹지를 못하고 있습니다.
: 결국 최대한의 SQL문으로 Data를 불러와서  프로그램으로 루프를 돌려 임시테이블에 입력하고
: 다시 그 임시테이블을 쿼리로 불러서 처리를 했습니다.
: 그 과정에서의 짜증과 스트레스는 이루 말 할 수 없습니다.
: 딱 한번 이짓거리를 한다면 그런대로 참을만 합니다만....  수많은 조회프로그램을 모두다 루프를 돌리고
: 임시테이블에 저장하고... 한다고 생각하니  앞이 꽊~ 막혀옴을 느낍니다.....
:
: 그래서 지금 손놓고  2.0나오기를 기둘리고 있습니다.
:
: 각설하고...
:
: 박지훈.임프님이 답변하신대로 if 앞 끝부분에 세미콜론(;)을 붙이면 고기서 에러나고
: Set TERM ^;  인가 이거쓰면 고기서 에러나고  둘다 빼면  if 문에서 에러나고....
:
: 조아래처럼  From절 다음에 where 절에 if문을 쓸수가 없는 것인가요?
:
: -- 변수부분 생략...
:    select   --거래처별 현황
:        cast(a.gc_clcd as varchar(5)) CODE,
:        cast('1' as varchar(1)) KUBN,
:        cast(c.ad_clnm as varchar(40)) "외주처명",
:        cast(
:        substring(b.ga_krno from 1 for 1)||'-'||substring(b.ga_krno from 2 for 4)||'-'||
:        substring(b.ga_krno from 6 for 2)||'-'||substring(b.ga_krno from 8 for 3)
:        as varchar(15)) "JOB NO",
:        cast(b.ga_desc as varchar(50)) "건   명",
:        cast(d.cd_des1 as varchar(20)) "구   분",
:        cast(a.gc_amnt as numeric) "외주금액",
:        case when a.gc_sngb = '1' then cast(a.gc_amnt as numeric) end "선지급액",
:        cast(e.ad_clnm as varchar(40)) "광고주명",
:        cast(b.ga_jbcd as varchar(3)) JBCD
:     from tr140t a
:            left outer join tr110t  b on a.gc_krno = b.ga_krno
:            left outer join client  c on a.gc_clcd = c.ad_clcd
:            left outer join tr010t  d on d.cd_iden = '1' and b.ga_jbcd = d.cd_code
:            left outer join client  e on b.ga_clcd = e.ad_clcd
:
:     if (selt = '1') then   --청구월기준이면 청구기간의 데이터를 가져와야  한다
:        where b.ga_cgdt >= stdt and b.ga_cgdt <= endt else
:        where b.ga_jsdt >= stdt and b.ga_jsdt <= endt
:     if (tpcd <> 'T') then  --전체구분이면 전체를 일부분이면 일부분데이터를...
:         and substring(b.ga_krno from 1 for 1) = tpcd
:     if (jbcd <> '' ) then
:         and b.ga_jbcd = jbcd
:     if (wjcd <> '' ) then   --전체거래처면 전체를 한 거래처면 한거래처만을 자겨와햐 한다
:         and a.gc_clcd = wjcd
:     and a.gc_clcd <> ''

+ -

관련 글 리스트
1569 [질문]FireBird의 SQL에서 if문 사용하기.. 아폴론 1980 2005/09/27
1570     Re:[질문]FireBird의 SQL에서 if문 사용하기.. 박지훈.임프 3461 2005/09/27
1571         Re 박지훈.임프님 감사 합니다. apollon 1563 2005/09/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.