<div class="summary">
	<p><span>공백 포함</span><strong class="letter" id="current_msglen">13</strong><span>자</span><strong class="byte" id="current_msg_byte">13</strong><span>byte</span></p>
	<p><span>공백 제외</span><strong class="letter" id="current_msglen_except_blank">13</strong><span>자</span><strong class="byte" id="current_msg_byte_except_blank">13</strong><span>byte</span></p>
</div>

<textarea name="content" id="character_counter_content" cols="70" rows="22" class="checker_input" placeholder="내용을 입력해주세요."></textarea>

 

 

 

(function (window, $, undefined) {
var $character_counter_content = $('#character_counter_content'), $checker_preview = $('#checker_preview'), $spell_check = $("#spell_check"), $spell_completion = $('#spell_completion'),
    $checker_spell = $('.checker_spell'), $result_pre = $('#result_pre'), $title_sub =  $('#title_sub'), $spell_count = $('#spell_count'), $checker_result = $('#checker_result'),
    $layer_suggetion = $('#layer_suggetion'), $spell_form = $('#spell_form'), $st_len = $('#current_msglen'), $st_byte = $('#current_msg_byte'), $steb_len = $('#current_msglen_except_blank'),
    $steb_byte = $('#current_msg_byte_except_blank');

//맞춤법 검사 버튼
$spell_check.on('click', function() {
    spellCheck();
});

//검사완료
$spell_completion.on('click', function() {
    spellCheckDone();
});

//일괄수정
$("#spell_done_all").on('click', function() {
    spellDoneAll();
});
//복사 하기 
$("#copy_all").on('click', function() {
    copyAll();
});
//초기화
$("#spell_reset").on('click', function() {
    SpellReset();
});
//실시간 글자수 세기
$character_counter_content.keyup(function() {
    chkMsgLength(this);
});

//레이어 팝업 
$(document).on('click','.spell_done' ,function(){
    spellDone(this);
});





function copyAll() {
    if($character_counter_content.val() === ''){
        alert('내용을 입력 해주세요.');
        return;
    }

    if($checker_preview.text() === '') { // 맞춤법 검사 여부 확인
        $character_counter_content.select();
        document.execCommand('copy');
    }else{
        var originalText =  $character_counter_content.val();
        var changeText = $checker_preview.text();
        $checker_preview.hide();
        $character_counter_content.val(changeText);
        $character_counter_content.show();
        $character_counter_content.select();
        document.execCommand('copy');
        $character_counter_content.hide();
        $character_counter_content.val(originalText);
        $checker_preview.show();
    }

    alert("입력하신  내용이 복사되었습니다.\n\nCtrl + v 키를 사용하여, 붙여 넣기를 사용하실 수 있습니다.");

    setTimeout(function() {
        try {
            if (document.selection) {
                document.selection.empty();
            } else {
                window.getSelection().removeAllRanges();
            }
        } catch (e) {}
    }, 1);
}


//맞춤법 검사
function spellCheck() {
    if($character_counter_content.val() === ''){
        alert('내용을 입력 해주세요.');
        return;
    }
    $result_pre.addClass('loading');
    $spell_check.prop('disabled', true);
    var $params = $checker_spell.find('textarea').serializeArray();
    $.ajax({
        url: '/zf_user/tools/spell-check',
        data: $params,
        type: 'post',
        dataType: 'json'
    }).success(function (result) {
            $character_counter_content.hide();
            $checker_preview.show();
            $spell_check.prop('disabled', false).hide();
            $spell_completion.show();
            $result_pre.removeClass('loading').hide(); //맞춤법 검사 시작 텍스트 숨김
            $title_sub.show(); //맞춤법 오류 리스트 노출
            $checker_preview.append(result.result_text);
            $spell_count.html('' + result.result_cnt +'개');
            if(result.result_cnt === 0){
                $checker_result.show().append('

검사 결과 맞춤법 오류가 없습니다.

');
            }else{
                $checker_result.show().append(result.speller_list);
            }
            $layer_suggetion.append(result.popup_speller_list);


    }).error(function() {

    });
}

//검사 완료
function  spellCheckDone(){
    var changeText = $checker_preview.text();
    $character_counter_content.val(changeText);
    $checker_preview.html('');
    $checker_preview.css('display','none');
    $character_counter_content.css('display','block');
    $title_sub.hide(); // 맞춤법 오류 리스트 영역 숨김
    $result_pre.show(); // 검사 버튼 눌러주세요 텍스트 노출
    $layer_suggetion.find('dl').remove();//레이어 팝업 초기화
    $checker_result.empty().hide(); //맞춤법 검사 초기화
    $spell_count.html(0 + '개'); //맞춤법 오류 갯수 초기화
    $layer_suggetion.css('display','none');
    $layer_suggetion.find('div').remove();
    $spell_completion.hide();
    $spell_check.show();
}

//초기화
/**
 * @return {boolean}
 */
function SpellReset(){

    if ( $character_counter_content.val() && !confirm('작성한 내용을 모두 삭제하시겠습니까?') ) {
        return false;
    }

    $spell_form[0].reset();
    $checker_preview.html('');
    $checker_preview.css('display','none');
    $character_counter_content.css('display','block');
    $spell_completion.hide();
    $spell_check.show();
    $title_sub.hide(); // 맞춤법 오류 리스트 영역 숨김
    $result_pre.show(); // 검사 버튼 눌러주세요 텍스트 노출
    $layer_suggetion.find('dl').remove();//레이어 팝업 초기화
    $layer_suggetion.css('display','none');
    $layer_suggetion.find('div').remove();
    $checker_result.empty().hide(); //맞춤법 검사 초기화
    $spell_count.html(0 + '개'); //맞춤법 오류 갯수 초기화
    $st_len.html(0);
    $st_byte.html(0);
    $steb_len.html(0);
    $steb_byte.html(0);
    return false;
}
//맞춤법 수정 갯수 확인 후 바꿔 준다.
function spellCheckConut(){
    var eorr_cnt;
    eorr_cnt = $spell_form.find('.wrong').length - $spell_form.find('.wrong.solved').length; //맞춤법 수정 전 - 수정후
    if(eorr_cnt > 0) {
        $spell_count.html('' + eorr_cnt + '개');
    } else {
        $spell_count.html(eorr_cnt + '개');
    }

}

//텍스트 교체
function spellDone(obj) {
    var index = $(obj).attr('value');//바꿀 단어
    var data_index = $(obj).attr('data-value');//단어 index
    $checker_preview.find('span.wrong').eq(data_index).addClass('solved').text(index); //바꿀단어로 텍스트 교체
    $checker_preview.find('span.wrong').eq(data_index).attr('original-text',index); //바꿀단어로 텍스트 교체
    $layer_suggetion.css('display','none');//교체  후 팝업 숨김
    chkMsgLength($checker_preview,'after'); //텍스트 길이 계산
    spellCheckConut();//맞춤법 갯수 확인
}

//일괄 수정
function spellDoneAll() {
    var error_word = $spell_form.find('.wrong');
    var button_first = $checker_result.find('button:first-child');
    error_word.each(function(i){
        $(this).addClass('solved').text(button_first.eq(i).html());
        $(this).attr('original-text',button_first.eq(i).html());
    });
    chkMsgLength($checker_preview,'after'); //텍스트 길이 계산
    spellCheckConut();//맞춤법 갯수 확인
    $layer_suggetion.css('display','none');
}



//텍스트 길이 계산
function chkMsgLength(objMsg,textType) {
    //공백 포함
    var vacuum_pattern = /\r\n/gm;
    var vacuum_text;
    var vacuum_length;
    //공백 미포함
    var vacuum_remove_pattern = /\s/gm;
    var vacuum_remove_text;
    var vacuum_remove_length;

    if(textType === 'after') {
        vacuum_text = $(objMsg).text();
        vacuum_length = lengthMsg(objMsg.text());
        vacuum_remove_length = lengthMsg($.trim(objMsg.text().replace(/ /g, '')));
    }else{
        vacuum_text = $(objMsg).val();
        vacuum_length = lengthMsg($(objMsg).val());
        vacuum_remove_length = lengthMsg(vacuum_text.replace(vacuum_remove_pattern,''));
    }
    vacuum_text = vacuum_text.replace(vacuum_pattern,'\n');
    vacuum_remove_text = vacuum_text.replace(vacuum_remove_pattern,'');

    $st_len.html(vacuum_text.length);//현재 글자수를 넣는다
    $st_byte.html(vacuum_length);//현재 byte수를 넣는다
    $steb_len.html(vacuum_remove_text.length);//현재 글자수를 넣는다
    $steb_byte.html(vacuum_remove_length);//현재 byte수를 넣는다
}

//텍스트 바이트단위 계산
function lengthMsg(obj_msg) {
    var nbytes = 0;
    var i;
    for (i = 0; i < obj_msg.length; i++) {
        var ch = obj_msg.charAt(i);
        if (encodeURIComponent(ch).length > 4) { // 한글일경우
            nbytes += 2;
        } else if (ch === '\n') { // 줄바꿈일경우
            if (obj_msg.charAt(i - 1) !== '\r') { // 하지만 밀려서 줄이 바뀐경우가 아닐때
                nbytes += 1;
            }
        } else { //나머지는 모두 1byte
            nbytes += 1;
        }
    }//END FOR
    return nbytes;
}
})(window, jQuery, undefined);

by 으스스 2019. 4. 14. 21:46

고객사 요청에 따라 <a href="/ekp/docs/manual/phone_directory.mht"~~~~ 식으로 확장자 mht 링크를 걸어줬다.

그런데... 반영 이후 해당 링크를 눌렀을 때 아래와 같이 익스플로러 브라우저에 출력이 되었다.

MIME-Version: 1.0
X-Document-Type: Workbook
Content-Type: multipart/related; boundary="----=_NextPart_01CF2D62.C56FFF10"

이 문서는 웹 보관 파일입니다. 이 메시지가 나타나면 사용자의 브라우저나 편집기에서 웹 보관 파일이 지원되지 않는 것입니다. Windows® Internet Explorer®와 같이 웹 보관 파일을 지원하는 브라우저를 다운로드하십시오.

------=_NextPart_01CF2D62.C56FFF10
Content-Location: file:///C:/506BCAB9/phone_directory.htm
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="us-ascii"


IE10으로도 IE11로도 똑같이 출력되기에 뭐가 문젠지 모르다가 혹시 웹서버 설정이 잘못된게 아닌가 생각이 들었다.

결국 해결했는데 경로는 다음과 같다

웹서버 web.xml에서 아래와 같은 MIME Type Mapping을 해주도록 하자!

<mime-mapping> 

    <extension>mht</extension>

    <mime-type>message/rfc822</mime-type> 

</mime-mapping>

로컬에서 테스트 해보니 잘되더라.. 이걸로 3시간이나 잡아먹었다 하...

해당 문제에 대해 참고할만한 사이트 

http://ko.wikipedia.org/wiki/MIME -위키백과

http://blog.naver.com/hipnos?Redirect=Log&logNo=80180230723 - mht 파일 직접열기 실패


'Programming > 개발 노트' 카테고리의 다른 글

입력값에 null/Empty 있는 경우 처리  (0) 2013.12.24
[iBatis] Dynamic SQL, iterate  (0) 2013.12.24
VirtualBox 다루기!!  (0) 2013.10.29
forward와 redirect의 차이  (0) 2013.10.28
by 으스스 2014. 2. 19. 16:07

iBatis 사용시 NULL 에 대한 주의 할 점.

1. 입력값이 빈 경우 처리

<isNotEmpty property="detailStatsKind">
      AND STATS_DETAIL_SE = #detailStatsKind#
</isNotEmpty>

2. biding 되는 값 중 NULL 이 있을 경우 기본값(default-value)로 치환 하는 법.
    <resultMap>
       <result property="valueObject-Field-Name"     column="Column-NamenullValue='0'/>
    </resultMap>

 와 같이 <result property    /> 에 nullValue= 를 이용하여 기본값을 얻어 올 수 있도록 한다.

위와 같이 하지 않을 경우, int-type 을 return  받길 예상 했으나, 적당한 값이 Bind 되지 않아 NULL 이

반환되면 result-Map 의 Class 에 정의한 int-type 변수와 null 이 만나게 되어 Exception 이 발생합니다.

3. parameter 인자가 NULL 이 전달 될 때, 적절한 값으로 type-casting 이 되지 않아, 예외가 발생.

Inser into table(A, b, c, d) values(#a-value#, #b-value#, #c-value#,#d-value#);

와 같이 sql 을 작성하고 , 파라메터 클래스를 이용하여 파라메터를 전달 할 때, 파라메터가 NULL-value 를 

전달 하게 되면, casting 에 문제가 생길 수 있습니다.

Interger-Class 또한 NULL-value 를 받아 넣을 수 있기 때문에, 그런지 정확한 type명시기 필요 합니다.

비단 insert 의 경우 뿐 아니라, 파라메터를 전달하는 모든 경우에 해당 될 수 있습니다.

따라서 아래와 같이 수정/정리 할 수 있습니다.

Inser into table(A, b, c, d) values(#a-value#, #b-value#, #c-value#,#d-value#);

==> Inser into table(A, b, c, d) values(#a-value:VARCHAR:NO_ENTRY#
                                                , #b-value:VARCHAR:
NO_ENTRY#
                                                 ,#c-value
:VARCHAR:NO_ENTRY#
                                                 ,#d-value
:VARCHAR:NO_ENTRY#);

    설명.
    #{parameter-Name}:{value-type}:{default-value}#

[출처] ibatis nullValue|작성자 tkgotjd


출처 : http://blog.naver.com/PostView.nhn?blogId=mankeys&logNo=161195599

'Programming > 개발 노트' 카테고리의 다른 글

mht가 이상하게 열린다?!  (0) 2014.02.19
[iBatis] Dynamic SQL, iterate  (0) 2013.12.24
VirtualBox 다루기!!  (0) 2013.10.29
forward와 redirect의 차이  (0) 2013.10.28
by 으스스 2013. 12. 24. 10:28

iBatis에서 Dynamic 기능중 iterate 노드가 있다.
예를 들어 
"select * from tableName where idx in ('3','6','9')" 
와 같이 조건절에 or절이 아닌 in 으로 쿼리를 구성할때 iBatis에서는 iterate 구문으로 구현이 가능하다.

먼저 파라메터클래스로 넘겨줄 값을 배열형식의 맵으로 생성한다.


ArrayList<String> idxList = new ArrayList<String>();
idxList.add("3");
idxList.add("6");
idxList.add("9");
....
HashMap<String, ArrayList<String>> idxMap = new HashMap<String, ArrayList<String>>() ;
idxMap.put("idxArr", idxList);


그리고 iBatis query.xml 파일에 아래처럼 작성한다.


<select id="getList" parameterClass="idxMap" resultClass="dataVO">
   select * from table
  <dynamic prepend="where">
    <isNotEmpty prepend="and" property="idxArr">
      <iterate prepend=" idx in " property="idxArr" open="(" close=")" conjunction=",">
        #idxArr[]#
      </iterate>
    </isNotEmpty>
  </dynamic>
</select>


그러면 iBatis에서 내부적으로 
select * from table where idx='3' or idx='6' or idx='9'
이런 쿼리로 만들어서 실행하게 된다.
위에서 dynamic 의 prepend 속성으로 "where" 가 지정되어 있지만 하위 요소의 조건이 하나라도 만족하지 않으면 sql 문에 추가되지 않는다. 그리고 하위 요소로 isNotNull 태그에 prepend="and" 는 처음 true 가 되는 조건의 prepend 는 parent 인 dynamic 의 prepend 인 "where" 로 덮어진다.


$property명$ 로 작성된 영역은 #property명# 와 같이 prepared statement 의 바인드 변수로 처리되는 것이 아니라 
SQL 문 자체에 텍스트가 replace 되어 처리됨에 유의한다. 


'Programming > 개발 노트' 카테고리의 다른 글

mht가 이상하게 열린다?!  (0) 2014.02.19
입력값에 null/Empty 있는 경우 처리  (0) 2013.12.24
VirtualBox 다루기!!  (0) 2013.10.29
forward와 redirect의 차이  (0) 2013.10.28
by 으스스 2013. 12. 24. 10:06

JSTL 에서 null 이 아닌 것에 대한 조건을 어떻게 하는가를

 

고민 할 수 있다

 

보통

 

<c:if test="${param.data != ''}">

 

라고 쓸 것이지만 이렇게 쓰면 null 처리가 정상적으로 안되는 경우가 발생한다.

 

그래서 이럴 땐

 

<c:if test="${param.data != '' || param.data ne null}">

 

로 사용 하면 된다. (ne 는 not equal 인 것으로 보인다.)

 

반대로 equal 을 찾을 땐

 

< c:if test="${param.data eq null }">

 

로 조건을 걸면 된다.


출처 : http://shonm.tistory.com/entry/JSP-JSTL-null-equal-%EA%B4%80%EB%A0%A8-%EB%AC%B8%EB%B2%95

오류처리 하다가 찾아본 내용이었는데 요컨데..

<c:if test="${param.cmd eq 'viewEditBoard' || 'viewAddBoard'}"> (X)

<c:if test="${param.cmd eq 'viewEditBoard' || param.cmd eq 'viewAddBoard'}"> (O)

라는 단순한 오류였다.. =ㅅ=


by 으스스 2013. 11. 27. 11:57

1. 설치 방법


Virtual Box를 이용해 MAC에 윈도우7 설치하기

 - http://imonis.net/92

 - mac에서 설치, 간략한 설명

 

[VirtualBox/Oralce] VM VirtualBox에 Oracle 설치하기

 - http://beans9.tistory.com/9

 - 윈도우에서 설치, 간략한 설명

 

VirtualBox 사용 방법 #1 : 프로그램 설치와 기본 설정 방법

 - http://blog.naver.com/hahaj1/20120351817

 - 윈도우에서 설치, 여러 포스트에 걸쳐 살세한 설명

 

VirtualBox에서 USB 메모리로 부팅하기‎

-http://www.cdrinfo.co.kr/entry/VirtualBox%EC%97%90%EC%84%9C-USB-%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%A1%9C-%EB%B6%80%ED%8C%85%ED%95%98%EA%B8%B0

 - USB에 설치된 윈도우로 이미지를 만든 후, 이를 이용하여 설치하는 방법

 

2. 속도 향상 방법

 

VirtualBox - 가상 PC의 인터넷 속도가 느릴때

 - http://veldise.tistory.com/91

 - 가상 머신 설정 - 네트워크 에서 어댑터 연결 바꿈.

 - NAT => 브리지 어댑터

 

VirtualBox 좀더 빠르게 써보자

 - http://blog.spowner.com/19

 - 호스트 I/O 캐시 사용하기를 체크하여 체감효과 봄. => 경험상.

 - 호스트가 윈도우일 경우: 빠름, 우분투일 경우: 느림, 맥일 경우는 기본 설치 시 옵션 켜 있음.

 - 옵션을 껐을 때 효과를 본다는 글: http://ihoney.pe.kr/920

 

3. 기타 문제해결

 

윈도우 부팅 후 메뉴의 "장치 → 게스트 확장 설치"로 VirtualBox Guest Additions를 설치할 수 없을 때

 - http://hummingbird.tistory.com/4447

 - 공개용 ftp (http://download.virtualbox.org/virtualbox/) 에서 버전에 맞는 VBoxGuestAdditions_x.x.x.iso 를 받아 설치

 

Mac OS의 VirtualBox에 Window 7을 설치했을 때

 - 오른쪽 cmd: 윈도우 키, 오른쪽 option 키: 한영 전환

 

Mac OS 에 VirtualBox 로 Windows 7 설치하기

 - http://ohgyun.com/394

 - Mac 에 Windows 7 설치 후, 몇 가지 팁

 

[Virtualbox] usb 인식이 안되는 문제 해결

 - http://blog.naver.com/newoverguy/130100804398

 

VirtualBox 하드 용량 늘리거나 줄이는 방법

 - http://blog.naver.com/PostView.nhn?blogId=vcmania&logNo=150240698

 - 동적 확장 저장소일 경우만 가능. 기존 이미지를 늘임. Mega 단위로 설정.

 - ex) VBoxManage modifyhd myOS.vdi --resize 20480


추가> VirtualBox 하드 용량 늘리거나 줄이는 방법(리눅스 파일 시스템 용량 변경 가능)

 - http://repository.egloos.com/5730315

 - 위의 용량 늘리기와 비슷하지만 가상 운영 체제(리눅스)의 용량도 조절할 필요가 있을때 사용.

 - 사실 위에꺼 안보고 이것만 봐도 됨.

 

How to resize a fixed size disk in VirtualBox

 - http://stuff.nekhbet.ro/2012/01/13/how-to-resize-a-fixed-size-disk-in-virtualbox.html

 - 고정 크기 저장소일 경우 적용. 새로 이미지를 생성하고 복사함.

 - ex) vboxmanage clonehd myOS.20gb.vdi myOS_30g.vdi

출처 : http://blog.naver.com/PostView.nhn?blogId=magtao&logNo=10166093924

1) 시키는대로 해도 안되는 것도 있는거 같다.. 너무 맹신하지는 말자.

2) 컴퓨터를 재부팅해야 동작하는 것도 있는거 같기도..

'Programming > 개발 노트' 카테고리의 다른 글

mht가 이상하게 열린다?!  (0) 2014.02.19
입력값에 null/Empty 있는 경우 처리  (0) 2013.12.24
[iBatis] Dynamic SQL, iterate  (0) 2013.12.24
forward와 redirect의 차이  (0) 2013.10.28
by 으스스 2013. 10. 29. 17:48

redirect와 forward의 차이

    - jsp 환경에서, 현재 작업중인 페이지에서 다른 페이지로 이동하는 두가지 방식의 페이지 전환 기능.


  * Forward : Web Container 차원에서 페이지 이동만 있다. 실제로 웹 브라우저는 다른 페이지로 이동했음을 알 수       없다.그렇기 때문에, 웹 브라우저에는 최초에 호출한 URL이 표시되고 이동한 페이지의 URL 정보는 볼 수 없다. 동일한  웹 컨테이너에 있는 페이지로만 이동할 수 있다.

   현재 실행중인 페이지와 forwad에 의해 호출될 페이지는 request와 response 객체를 공유한다.


  * Redirect : Web Container는 Redirect 명령이 들어오면 웹 브라우저에게 다른 페이지로 이동하라고 명령을 내린다. 그러면 웹 브라우저는 URL을 지시된 주소로 바꾸고 그 주소로 이동한다. 다른 웹 컨테이너에있는 주소로 이동이 가능하다.

   새로운 페이지에서는 request와 response객체가 새롭게 생성된다.


  웹 개발을 하는 사람이라면 아주 익숙한 단어일 것이다. 둘 다 한 페이지에서 다른 URL 로 이동하고자 할 때 사용된다. 하지만 두방식은 커다란 차이점을 가지고 있다.


  forward 방식은 다음 이동할 URL로 요청정보를 그대로 전달한다. 말 그대로 forward(건네주기) 하는 것이다. 그렇기 때문에 사용자가 최초로 요청한 요청정보는 다음 URL에서도 유효하다.



 반면 redirect의 경우 최초 요청을 받은 URL1 에서 클라이언트에 redirect할 URL2을 리턴하고, 클라이언트에서는 전혀 새로운 요청을 생성하여 URL2에 다시 요청을 보낸다. 따라서 처음 보냈던 최초의 요청정보는 더 이상 유효하지 않다.



   forward와 redirection의 이러한 차이 때문에 실제 웹 애플리케이션을 작성할 때 두 가지 방식 중 하나를 적절히 선택하여 사용해야 한다.

  예를 들어, 게시판 애플리케이션을 작성한다고 하자. 사용자가 보낸 요청 정보를 이용하여 글쓰기 기능을 수행하는 CGI가 있다면, 이 CGI의 응답 페이지는 forward와 redirection 중 어느 것을 사용해야 할까? 정답은 redirection이다. 사용자가 실수 혹은 고의로 글쓰기 CGI의 응답 페이지에서 '새로고침'을 누르면 어떻게 될까? forward의 경우 요청정보가 그대로 살아있기 때문에 똑같은 글이 여러번 등록될 수 있다. 하지만 redirection의 경우 처음 글을 작성할 때 보냈던 요청 정보는 존재하지 않는다. 또한 글쓰기 기능을 하는 URL1이 아닌 URL2로 요청을 보내기 때문에 글쓰기가 여러번 수행되지 않는다.

  한 마디로 시스템(세션, DB, ...)에 변화가 생기는 요청(로그인, 회원가입, 글쓰기 등)의 경우 redirection 방식으로 응답하는 것이 바람직 하며, 시스템에 변화가 생기지 않는 단순 조회 요청(글 목록 보기, 검색 등)의 경우 forward 방식으로 응답하는 것이 바람직하다.


출처 : http://blog.naver.com/saintw?Redirect=Log&logNo=100165339381

[출처] redirect, forward 차이|작성자 임성수

[출처] redirect, forward 차이|작성자 임성수


'Programming > 개발 노트' 카테고리의 다른 글

mht가 이상하게 열린다?!  (0) 2014.02.19
입력값에 null/Empty 있는 경우 처리  (0) 2013.12.24
[iBatis] Dynamic SQL, iterate  (0) 2013.12.24
VirtualBox 다루기!!  (0) 2013.10.29
by 으스스 2013. 10. 28. 09:37

MS-SQL로 여러 행의 데이터 값을 하나의 행으로 할 때 필요한 쿼리문입니다.

가령, 값이 아래와 같을때..

ID 

Title 

나 

1

다 

2

2

마 

2

사 













아래 테이블처럼 보여주고 싶다면

 ID

Title 

 1

가,나,다 

 2

라,마,사 


이러한 쿼리문을 날려보자!

SELECT DISTINCT 

ID,

STUFF((

SELECT ',' + Title

            FROM TB_Data b

WHERE b.ID = a.ID

FOR XMLPATH('')

), 1, 1 '') AS NAME

 FROM TB_Data a

출처 : http://akddd.net/224

by 으스스 2013. 7. 20. 17:46
| 1 |