2013-06-11 2 views
1

를 사용오라클 SQL 순서 나는 orderspec에 ORDER BY 절을 사용하여 정확하게 정렬 할 varchar50의 번째 열에를 얻기 위해 노력하고 있어요 ibatis.xml 매핑

샘플 데이터 :

test123 
Test45 
47589 Joe 
34 Alex 
23478 amy 
Brian 5 
brian 4789 

그것을 실제로 숫자와 문자의 조합은 최대 50 개가 될 수 있습니다.

기본적으로 정렬이 필요합니다. 숫자 만 (순서에 관계없이 길이가 1, 2, 3,10이 아닌 1, 10, 2, 3 그런 다음 알파벳을 정렬해야합니다. Ś 문자열의 첫 단어를 기반으로 대소 문자에 관계없이.

이 열은 Oracle DB의 varchar50입니다. 여기

코드의 샘플입니다

<sql id="order-by-clause"> 
    <isPropertyAvailable property="OrderSpec"> 
    <isNotNull property="OrderSpec"> 
     ORDER BY 
     <isEqual property="OrderSpec.Property" compareValue="javascriptName"> 
     mcn.my_column_name 
     </isEqual> 
     $OrderSpec.Direction$ 
    </isNotNull> 
    </isPropertyAvailable> 
</sql> 

당신은 우리가 UI에서 정렬 방향 (ASC/DESC)에 전달되어 볼 수 있듯이.

현재 colummn의 기본 정렬은 원하는 결과를 생성하지 않으므로 이에 맞게 조정할 수 있어야합니다.

감사합니다.

답변

0

XML 및 IBATIS에 대해 확실하지 않습니다. 그러나 XML ~ ORACLE을 사용하여 ORDER BY을 전달할 수있는 경우 숫자 부분 문자열을 숫자로 변환하고 정렬하여 정렬 한 다음 영숫자를 정렬해야합니다. 사용되어야하는 까다로운 정규 표현식입니다.

여기에 대해서는 SQLFiddle입니다.

<sql id="order-by-clause"> 
    <isPropertyAvailable property="OrderSpec"> 
    <isNotNull property="OrderSpec"> 
     ORDER BY 
     <isEqual property="OrderSpec.Property" compareValue="javascriptName"> 
     lpad(to_number(regexp_substr(mcn.my_column_name,'^[0-9]*')),10,'0') 
    || lpad(to_number(regexp_substr(mcn.my_column_name,'[0-9]*$')),10,'0') 
    || regexp_replace(mcn.my_column_name,'[0-9]*') 
     </isEqual> 
     $OrderSpec.Direction$ 
    </isNotNull> 
    </isPropertyAvailable> 
</sql>  

가 작동 희망 : 나는이 도구를 사용하면 진드기와 함께 작동하는 방법 확실하지 오전하지만 난 당신의 XML은 다음과 같이해야한다 생각하기 전에 말했듯이 전체 SQL SELECT이

select mcn.my_column_name, lpad(to_number(regexp_substr(mcn.my_column_name,'^[0-9]*')),10,'0') 
     || lpad(to_number(regexp_substr(mcn.my_column_name,'[0-9]*$')),10,'0') 
     || regexp_replace(mcn.my_column_name,'[0-9]*') as sortcrit 
from tst 
order by lpad(to_number(regexp_substr(mcn.my_column_name,'^[0-9]*')),10,'0') 
     || lpad(to_number(regexp_substr(mcn.my_column_name,'[0-9]*$')),10,'0') 
     || regexp_replace(mcn.my_column_name,'[0-9]*') 

과 같을 것이다.