database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 30053 게시물 읽기
No. 30053
쿼리를 간결하게 사용하고 싶은데 아무리 고민해도 답이 없네요 ㅠ
작성자
dongkkase
작성일
2011-08-30 12:36ⓒ
2011-08-30 12:41ⓜ
조회수
7,998

안녕하세요. 뉴비 코더입니다 ㅠ

개발도중 필요에 의해 쿼리가 아래와 같이 나왔습니다.

 

    IF (@res_day=30, (SELECT pi_30 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
        IF (@res_day = 45, (SELECT pi_45 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
           IF (@res_day = 60, (SELECT pi_60 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
              IF (@res_day = 90, (SELECT pi_90 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
                 IF (@res_day = 120, (SELECT pi_120 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
                    IF (@res_day = 150, (SELECT pi_150 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
                       IF (@res_day = 180, (SELECT pi_180 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
                          IF (@res_day = 210, (SELECT pi_210 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
                             IF (@res_day = 240, (SELECT pi_240 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
                                IF (@res_day = 270, (SELECT pi_270 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
                                   IF (@res_day = 300, (SELECT pi_300 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
                                      IF (@res_day = 330, (SELECT pi_330 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),
                                         IF (@res_day = 365, (SELECT pi_365 FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1),"")
                                      )
                                   )
                                )
                             )
                          )
                       )
                    )
                 )
              )
           )
        )
    )

정말 가독성도 매우 떨어지고 얼핏 효율성도 떨어질것같은 느낌입니다.(뉴비라 실제 효율성이 떨어지는지 확인 까지는..ㅠ)

그래서 위와 같은 코드를 아래와 같은 코드처럼 효율성있게 만들고 싶은데, 제가 생각하는 것처럼 되지는 않네요 ^^;

SET @res_day = 'pi_30';
SELECT @res_day FROM product_insurance_client WHERE app_idx = app.app_idx AND pi_age = @age LIMIT 1

일차적으로 api를 찾아 보았지만 저렇게 쓰면 그냥 단순히 '문자열'로 읽히고 마는 것 같아요..  저부분을 단순 문자열로 반환하는게 아니라,
컬럼처럼 인식하여, 해당 컬럼의 데이터를 추출할 수 있는 방법이 없을까요?

이 글에 대한 댓글이 총 3건 있습니다.

방법은 있습니다.

다만 저 쿼리가 단독으로 사용되는지, 다른 쿼리 내부에서 사용되는지에 따라 가능여부가 나뉘겠군요..

일단 방법은 아래 두가지..

--

1. 어플리케이션 소스 상에서 쿼리 조작

2. Dynamic SQL을 이용해 프로시져 작성

조래혁(jjorae)님이 2011-08-30 16:11에 작성한 댓글입니다.

다른궈리 내부, 즉

select
(이곳)
from table_name

에서 사용됩니다.

서버단 언어에서 사용하며 단 쿼리 내에 서버단 언어가 사용되면 안되는 부분입니다 ㅜㅜ
(설계 및 기능상 서버단 언어사용하기엔 양이 너무 방대해져 버리는 어처구니가 없는 현실 OTL)

다이나믹 SQL를 사용 하여 프로시져를 만들면 서버단 언어에서 사용 가능할까요?

dongkkase님이 2011-08-30 16:21에 작성한 댓글입니다. Edit

예를 들어, 아래와 같이 뷰를 만들어 가로 테이블을 세로로 변경한다면 문제가 좀 쉬워질 것 같습니다. 직접 실행해본건 아니라 잘 될진 모르겠습니다만, 아이디어 차원에서 봐주세요. :)

CREATE VIEW product_insurance_client_res_day 

SELECT 30 AS res_day, pi_30 AS pi, app_idx, pi_age FROM product_insurance_client UNION ALL

SELECT 45 AS res_day, pi_45 AS pi, app_idx, pi_age FROM product_insurance_client UNION ALL

...

SELECT 365 AS res_day, pi_365 AS pi, app_idx, pi_age FROM product_insurance_client;

 

 

위와 같은 뷰가 존재한다면 SELECT pi FROM product_insurance_client_res_day WHERE app_idx=app.app_idx AND pi_age = @age AND res_day = 30; 과 같이 쿼리를 할 수 있게 됩니다.

 

참고하세요.

박현우(lqez)님이 2011-09-02 10:46에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
30056groupby로 특정 조건일때에만 합을 구하고 싶습니다. [1]
김성원
2011-09-09
8220
30055간단한 join 문제...도와주세요 ㅠ_ㅠ [1]
정종영
2011-09-05
7651
30054MySQL 데몬 실행시 에러... [1]
우리끼리
2011-08-31
8849
30053쿼리를 간결하게 사용하고 싶은데 아무리 고민해도 답이 없네요 ㅠ [3]
dongkkase
2011-08-30
7998
30052DB 복구 가능 여부를 알고 싶습니다. [1]
서버삭제
2011-08-29
7436
30051리플리케이션 옵션 변경건이요 [1]
1212
2011-08-29
8261
30050검색쿼리 [1]
syy
2011-08-27
7756
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다