select 쿼리문 어떻게 생성하시나요?

kws4679의 이미지

이런것을 다이나믹 쿼리라고 하나요 정확히 용어를 잘 모르겠지만

보통 게시판이나 검색에서 이런경우가 많던데요

예를들어 이름, 나이, 성별, 등으로 검색한다고하면

사용자가 각각 이름, 나이, 성별을 검색 조건을 하지 않았을때 부터시작해서 각 조건을 설정했을때

그리고 특히 나이같은경우는 어느 나이부터 어느나이까지를 검색해야 되고 이런 상황에서

체계적으로 쿼리를 작성하거나 프로그램을 구성하는 방법이 없을까요? 너무 중구난방식으로 if else 만 들어가는거같고

흐름도 보기 매우 안좋더군요....

거기다가 쿼리 자체가 뭔가 통일성이 있는게 아니라 예를들어 where 문이 처음나오면 그냥 쓰고 다음부터는 and, or 등으로 이렇게 나눠지니

또 preparedstatement 쓰면 ' 표시가 들어가서 어쩔수도 없고..

조건에 따른 쿼리 생성이 매우 힘든것 같습니다 보통 어떻게들 하시는지 알고싶습니다!!

addnull의 이미지

우선 모든 where 조건을 가진 쿼리 문자열을 만들고 실제 비교 값을 바꾸는 방식을 씁니다.
mysql 환경에서 예를 들면,

-- 이름과 크기 조건을 모두 포함한 일반적 쿼리문 작성
SET @query = CONCAT( "                                                                                        
    SELECT *
    FROM `my table`
    WHERE `name` LIKE \"%{0}%\"
        AND `size` BETWEEN {1} AND {2};
" );
 
-- 검색 조건에 맞게 비교 값들을 바꿈
SET @query2 = @query;
SET @query2 = REPLACE( @query2, "{0}", "%" ); -- 이름에 대한 검색 조건은 없지만, 크기에 대한 조건이 있을때,
SET @query2 = REPLACE( @query2, "{1}", "0" );
SET @query2 = REPLACE( @query2, "{2}", "100" );
PREPARE stmt FROM @query2;
EXECUTE stmt;
DROP PREPARE stmt;
 
-- 검색 조건에 맞게 비교 값들을 바꿈 (2)
SET @query2 = @query;
SET @query2 = REPLACE( @query2, "{0}", "Steve" ); -- 이름에 대한 검색 조건은 있지만, 크기에 대한 조건이 없을 때,
SET @query2 = REPLACE( @query2, "{1}", "-99999999" );
SET @query2 = REPLACE( @query2, "{2}", "99999999" );
PREPARE stmt FROM @query2;
EXECUTE stmt;

이 방법이 가장 좋은 방법인지는 모르겠습니다.
더 좋은 방법을 아시는 분은 답글 부탁 드립니다.

swish95의 이미지

위에 답글 다신분은 프로그램적으로 접근하신거 같아서

저는 DB 에서의 접근 방식으로 답변 달아 보겟습니다.

일단 Sql Injection 이나 기타 DB 에 대한 공격을 감안하신다면

Stored Procedure 와 같은 DB의 기능을 이용하는것이

제가 가진 Query 의 첫번째 규칙입니다.

그리고는 쿼리를 이렇게 짭니다.

SELECT 신상정보.이름, 신상정보.나이, 신상정보.성별, 신상정보.주거지역 
FROM 신상정보
WHERE 1=1
    AND ( $이름검색값 = "" OR $이름검색값 = 신상정보.이름 ) 
    AND ( $나이검색시작값 = "" OR $나이검색시작값 < 신상정보.나이 )
    AND ( $나이검색끝값 = "" OR $나이검색끝값 > 신상정보.나이 )
      .......

$이름검색값 이렇게 쓴건 DB 마다 인자값 처리 규칙이 다르니 적당히 적은겁니다.

이렇게 하면 다소 쿼리가 길어질수 있지만

검색조건이 있을때와 없을때가 한번에 처리되는 좋기는 합니다.

그리고 1=1 이렇게 쓴건 글 쓰신분이 말씀하신대로

WHERE 문뒤에 처음 나오는 검색조건이냐에 따라서 AND, OR 이 붙기도 하고 안붙기도 하니까

일단 항상 참인 비교 구문을 적는거죠 별 뜻은 없습니다. ^^

항상 그렇지만 DB 를 잘하는 사람은 무조건 Query 로 해결하려고 하고

프로그램 잘 하는 사람은 무조건 프로그램으로 해결하려는 경향이 있죠 ㅋㅋ

일반적으로 웹사이트든, 검색 프로그램이든 WAS 가 바쁘지 DB 가 바쁜 경우는 드문것 같습니다.

그니까 위처럼 쿼리를 좀더 신중하게 짜고 DB 테이블 튜닝좀 해서

DB 에 부하를 적절히 분배해주는게 제가 가진 두번째 규칙입니다. ^^

------------------------------------------------------------
ProgrammingHolic

swish95의 이미지

삭제가 안되네요 ㅠ.ㅠ

------------------------------------------------------------
ProgrammingHolic

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.