게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
아래에sql에서 if를 써서 쿼리를 선택이 가능할까요?에 대해 해결
게시물ID : programmer_13084짧은주소 복사하기
작성자 : 문식이당
추천 : 1
조회수 : 408회
댓글수 : 3개
등록시간 : 2015/09/04 15:09:00
해결했습니다. 우선 기능에 대해서 왜쓰는지 알려드리겠습니다. 너무 길어질꺼 같아서
이렇게 글을 다시 쓰게 됬습니다.


회원, 비회원이 물건을 샀을시 장바구니 테이블에 update 하는 과정이였습니다.
예로 들면

회원이 물건을 산다 -> cart_D 테이블에 회원 + 장바구니 pk를 찾아서 삭제 update를 한다.
비회원이 물건을 산다 -> be_cart_D 테이블에 비회원 + 장바구니 pk를 찾아서 삭제 update 한다.
이과정을 해야 했습니다. pg사 연동후 결제가 완료후에 저 쿼리를 날려야 되는데 결제가 완료되면
pg사에서는 주문번호만 날려줍니다. 그렇게 되면 주문번호 하나로 모든걸 해야 합니다.
그래서 stored routine을 사용 했습니다. ( 쿼리를 한번 신호에 3~4개씩 동작 시키기 위해 )
(call pay_success(); 하면 pay_success에 해당되는 쿼리를 다 발동 시킨다.)


문제는 비회원, 회원 구분을 해야 했습니다. 그방법을 비회원일때는 회원 pk를 '000000' 회원일 때는 '00001~000xx'로설정 했습니다.
이제 조건은 간단합니다.


회원pk가 000000 일때
update be_cart_D set where 회원pk=? and 장바구니pk =?;
회원pk가 000000 아닐때
update cart_D set where 회원pk=? and 장바구니pk =?;
이걸 했어야 했습니다!! 그래서 if문을 물어본거였고요..... 저는 mariasql을 쓰기 때문에 도저히 방법을 떠오르지 않았습니다.
그러다가 문뜩 생각한게 tabe명만 다르면 되니깐 tabe명을 변수로 한다면?

바로 검색후 실행했습니다. 아래와 같이하면 
select if (@회원pk = '00000', 'be_cat_D', 'cart_D');
@회원pk 가 00000(비회원)일때는 'be_cart_D'를 선택 아닐때는 'cart_D' 선택을 했습니다.
그럼 다시
set @table_name = (select if (@회원pk = '00000', 'be_cat_D', 'cart_D')); 
// @table_name에 be_cart_D 또는 cart_D가 들어간다.
select * from @table_name; 을 했는데 실패... 아 왜 안될까 하다가 멍청하게
@table_name은 문자형이기 때문에  ' ' 을 치게 되어 있습니다. 결국

select * from 'be_cart_D'    or   select * from 'cart_D' 였기 때문에 안된거였습니다...
그럼또 검색.... sql 테이블 변수화 검색후 또 알아낸 방법
http://www.sqler.com/?mid=bSQLQA&category=128531&page=16&sort_index=readed_count&order_type=desc&document_srl=270956
declare @tablename varchar(50)
declare @sqltext varchar(max)
 
set @tablename='상품'
set @sqltext='update '+@tablename + ' set 상품명= ''C'''
exec (@sqltext)

쿼리자체를 문자형으로 쓴후 exec()로 문자된 쿼리를 실행이였습니다. 바로 헀지만 실패 이번에는 검색을
mariasql exec 후
https://mariadb.com/kb/en/mariadb/prepare-statement/#example
PREPARE stmt FROM 'SELECT @x;';

SET @x = 1;

EXECUTE stmt;
예제를 보고 어떤 형식인지 이해하고 다시 도전 
set @table_name = 'cart_D'
set @sql = 'select * from' + @table_name;
select @sql; 하는데 자꾸 0만 출력;; 아 뭐지... char 랑 char끼리는 더하기 가 안되나?싶어서 혹시몰라

set @table_name = 'cart_D'
set @sql = 'select * from' + cast(@table_name as char);  // 이렇게 강제 type을 char로 바꾸고 출력했는데도 0이 출력...

아 너무 힘들다 라고 생각하다가 CONCAT()을 알아냈습니다.
set @table_name = 'cart_D'
set @sql = CONCAT('select * from ', @table_name);
select @sql; 를 해보았는데 다행시
'select * from cart_D' 란 텍스트를 가져 왔습니다. 이제 여기서 아까 검색한걸 붙여서

set @table_name = 'cart_D'
set @sql = CONCAT('select * from ', @table_name);
PREPARE stmt FROM @sql
EXECUTE stmt; 하는 순간 
'select * from cart_D' 로 만든 텍스트가 select * from cart_D의 쿼리로 실행!! 아..됐다 싶어서....
위에 이용한 if로 be_cart_D 나 cart_D를 선택후 CONCAT(); 를 이용하여 쿼리를 완성 시켰습니다.


어떤 쿼리를 어떻게 짯는지해 대해서는 회사 DB라서 자세히는 말할순 없지만ㅠㅠ.. 그래도 댓글에 조언으로 
검색 키워드를 잘 따라왔고 영감을 얻어서 잘 해결했습니다 조언주신분들 감사합니다.
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호