애용
617
2021-03-09 14:12:08
10
163

mybatis 쿼리 질문있습니다.


안녕하세요.

구글에서 검색을 해보았지만 원하는 답이 나오질 않아서 질문드립니다ㅠㅠ

예를들어

  SELECT TO_CHAR(START_DD, 'YYYYMMDD') AS startDd
          FROM PLAN 
         WHERE A_CD = #{aCd}           
           AND a_KND = #{aKnd}
           AND TO_CHAR(START_DD, 'YYYYMMDD') >= #{startDd}
           AND TO_CHAR(END_DD, 'YYYYMMDD') < #{endDd}
      GROUP BY START_DD
      ORDER BY START_DD ASC

이런식의 SELECT 쿼리가있는데 aCd의 값은 2고정이고 aKnd가 1~3까지 있습니다.

한페이지에서는 aKnd값이 1,2 인 데이터를 조회하고

다른페이지에서는 aKnd값이 3인걸 조회하고싶어요..

aKnd가 3인페이지는 조회가 잘되는데 aKnd값 1,2인곳 조회는 어떻게 해야할지를 모르겠어서요..

시간내서 읽어주셔서 감사합니다. 답변해주시면 감사하겠습니다

0
  • 답변 10

  • 친슈
    271
    2021-03-09 14:23:33

    1, 2인 데이터를 조회한다는게 1과 2가 값인 데이터를 검색한다는 의미라면 `=` 이 아닌 in으로 검색을 하셔야겠습니다.

  • 성능최적화계획
    711
    2021-03-09 14:25:18 작성 2021-03-09 14:25:42 수정됨

    aKnd가 1~2 또는 3 두가지로 정적으로 나뉜 경우


      SELECT TO_CHAR(START_DD, 'YYYYMMDD') AS startDd
              FROM PLAN 
             WHERE A_CD = #{aCd}           
    <if test='kndKey == "A"'>
               AND a_KND IN ('1', '2')
    </if>
    <if test='kndKey == "B"'>
               AND a_KND IN ('3')
    </if>
               AND TO_CHAR(START_DD, 'YYYYMMDD') &gt;= #{startDd}
               AND TO_CHAR(END_DD, 'YYYYMMDD') &lt; #{endDd}
          GROUP BY START_DD
          ORDER BY START_DD ASC


    아니면 foreach 써야할거 같아여

  • 애용
    617
    2021-03-09 14:30:31

    우선 답변감사드립니다!


    <if test="aKnd == 1">
                   AND (A_KND = 1 OR A_KND = 2)
               </if>
               <if test="aKnd == 3">
                   AND A_KND = 3
    </if>

    이런식으로 제가 if문을 넣어봤는데요 

    데이터는 잘나오는데 뭔가 하드코딩..? 인듯한 느낌이들어서

    foreach문을 사용해서 하는법좀 설명해주실수 있으신가요..?

    찾아봐서 시도해봣는데 잘안돼서요..ㅠㅠ

  • 장독깨기
    2k
    2021-03-09 14:46:54

    어레이를 넘겨주면 됩니다.


    String[] list = ["1","2"];

    또는 list = ["3"]; 


    WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach>


  • 애용
    617
    2021-03-09 14:50:04

    장독깨기 

    답변감사드립니다!

    foreach문을 찾아서

    <if test="@Ognl@isNotEmpty(aKnd)">
                   AND A_KND IN
                   <foreach collection="aKnd" item="item" open="(" separator="," close=")" index="index" >
                       #{item}
                   </foreach>
               </if>

    1,2따로 3따로 해서 두페이지를 조회하고 싶은데 저렇게 foreach문을 사용하였더니

    1,2,3모두 한페이지에 다 조회가 됩니다.. 저기서 나눌방법이 있을까요..?

  • Alloien
    671
    2021-03-09 15:25:32


    <choose>
        <when test="col == '3'">
             AND col = '3'
        </when>
        <otherwise>
            AND (col = 1 OR col = 2)
        </otherwise>
    </choose>

    뭐 이런식으로도 해되 되죠...

    아니면 foreach 문 안에서 if 처리해도 되구요...

  • 애용
    617
    2021-03-09 15:32:17

    Alloien

    답변 감사합니다 
    foreach는 찾지를 못해서 if문 처리로 하였는데


    <if test="aKnd == 1">
                   AND A_KND IN (1,2)
               </if>
               <if test="aKnd == 3">
                   AND A_KND = 3
               </if>

    이렇게 하여도 딱히 하드코딩..? 은 아니죠..??

  • Alloien
    671
    2021-03-09 18:41:30

    애용 

    딱히 하드코딩은 아니지만 

    choose 로 묶어서 when 으로 분류하는게 나중에 보기 더 좋아요


    A 가 1이면 a를 2이면 b를 3이면 c를 해라 

    vs

    A가 1이면 a를 해라.

    A가 2이면 b를 해라.

    A가 3이면 c를 해라.


    한 큐에 끝내는게 이해도 쉽고 논리적으로 맞지 않을까요?

  • 애용
    617
    2021-03-10 09:14:18

    Alloien 

    감사합니다.

    나중에 데이터가 추가되는걸 대비해서 foreach로 하려하였는데 잘안대면 if보다는 말씀해주신 choose로 묶어야겠네요

  • 장독깨기
    2k
    2021-03-10 09:41:19

    저 foreach 쿼리 문을 호출할 때 

    String[] list = ["1","2"];

    또는

    String[] list = ["3"]; 

    를 구분해서 넘겨주면 if,choose 할 필요가 없지 싶습니다.

    쿼리 문 안에 상수 넣으면 하드 코딩 맞습니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.