2015-02-05 2 views
1

로 시작 INT 같은 I 클라이언트가 같은 값 입사 내 DB에서 열 '이름'가지고MySQL의 정렬 순서 VARCHAR 문자

샘플 1 샘플 2 샘플 101, 샘플 11, 샘플 20, 샘플 (100)을, 난이 열에 의해 결과 데이터를 주문하고자 할 때 몇 가지 샘플, 샘플 활성 등 때문에

이며, 대신

active sample 
sample 1 
sample 100 
sample 101 
sample 11 
sample 2 
sample 20 
some sample 

active sample 
sample 1 
sample 2 
sample 11 
sample 20 
sample 100 
sample 101 
some sample 

그래서 데이터는 숫자로 시작하지 않습니다. 때로는 숫자로 끝나기도하지만 때로는 숫자가 전혀 나오지 않을 수도 있습니다. 사전 순으로 정렬하는 것이 중요하지만 데이터가 동일한 접두어와 일치 할 경우 값을 int로 정렬해야합니다.

미리 감사드립니다. 아래의 코드이 매우 추악한 조각 속보

+0

데이터에 숫자가 들어 있으면 항상 공백으로 구분 되나요? 또한 데이터가'sample 123 moretext'와 같을 수 있습니까? –

+0

예, 항상 분리되어 있지만 숫자 앞에 한 단어 이상이있을 수 있습니다. 나는 여전히 "샘플 123 moretext"와 같은 데이터를 찾지 못했습니다. – Aleks

+0

번호가없는 접두어를 처음이나 마지막으로 사용 하시겠습니까? –

답변

-1

...

그것이 ' ' 문자가 포함되어 있는지 확인하기 위해 초기 값 및 테스트를 가져 가라. 그렇다면 우리는 해당 ' ' 문자의 색인을 분리하기 시작합니다. 없다면 초기 값을 반환합니다. 추가 가능성이 각각 ' ' 인 구분 된 문자열에 대해 재귀를 시작하십시오. 이것은 2 ' '으로 구분 된 단어 다음에 숫자 값이 올 수 있도록 구성되거나 경우에 따라 허용되지 않습니다. 여기

SQL 바이올린 : http://sqlfiddle.com/#!2/70168/7

검색어 :

SELECT 
    sampleInfo, 

    IF (LOCATE(' ', sampleInfo) > 0, 
     SUBSTRING(sampleInfo, 1, LOCATE(' ', sampleInfo) - 1), 
     sampleInfo) AS firstPart, 

    IF (LOCATE(' ', sampleInfo) > 0, 
     IF (LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) > 0,   
      SUBSTRING(
      SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1), 
      1, 
      LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) - 1), 
      SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)), 
      0) AS secondPart, 

    IF (LOCATE(' ', sampleInfo) > 0, 
     IF (LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) > 0, 
      SUBSTRING(
      SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1), 
      LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) + 1), 
      0), 
     0) AS thirdPart  

FROM test 
ORDER BY 
    firstPart, 
    thirdPart, 
    CONVERT(secondPart, SIGNED) --if conversion fails the value is 0 

결과 :

 
╔═══════════════╦═══════════╦════════════╦═══════════╗ 
║ SAMPLEINFO ║ FIRSTPART ║ SECONDPART ║ THIRDPART ║ 
╠═══════════════╬═══════════╬════════════╬═══════════╣ 
║ asdf 1  ║ asdf  ║ 1   ║   0 ║ 
║ asdf 2  ║ asdf  ║ 2   ║   0 ║ 
║ sample  ║ sample ║ 0   ║   0 ║ 
║ sample 1  ║ sample ║ 1   ║   0 ║ 
║ sample 2  ║ sample ║ 2   ║   0 ║ 
║ sample 11  ║ sample ║ 11   ║   0 ║ 
║ sample 20  ║ sample ║ 20   ║   0 ║ 
║ sample 100 ║ sample ║ 100  ║   0 ║ 
║ sample 101 ║ sample ║ 101  ║   0 ║ 
║ sample test 1 ║ sample ║ test  ║   1 ║ 
║ sample test 2 ║ sample ║ test  ║   2 ║ 
╚═══════════════╩═══════════╩════════════╩═══════════╝ 

면책 조항 :이 솔루션은 매우 성능이 좋은 또는 확장하지 않습니다. 몇 가지 예를 들어 이라는 언어를 사용하여 PHP 또는 C#과 같은 다른 언어로 작업하면 훨씬 더 효과적입니다. 이것은 또한 귀하가 귀하의 의견에 언급 한 내용에 근거하여 귀하의 데이터에 대한 몇 가지 가정을합니다.

+0

잘 작동합니다. 감사합니다. – Aleks