2012-09-06 2 views
5

"human"알파벳 순이지만 컴퓨터 알파벳 순서가 아닌 제목이있는 테이블이 있습니다. 이러한 숫자와 알파벳 두 풍미에 :SQL 문자열 조작을 사용하여 ORDERBY "human"사전 순 주문

  • 수치 : 1.9도, 1.10도, 1.11도 ...

  • 알파벳 :도 1a ...도 1Z .. .도 1AA

I가 orderby 타이틀 결과 1.10-1.19 1.1와 1.2 사이에 서 있다고하고, 1AA-1AZ은 1A 및 1B 사이 오면. 그러나 이것은 내가 원하는 것이 아닙니다. 1.10이 1.9, 1AA가 1Z 다음에 오는 "인간"알파벳 순서를 원합니다.

SQL에서 문자열 조작 (또는 내가 생각하지 못했던 다른 것)을 사용하여 원하는 명령을 얻는 방법이 아직 남아 있는지 궁금합니다.

저는 SQL 전문가가 아니므로 가능한지 모르지만 조건부 대체를 수행 할 방법이 있다면 다음과 같이 원하는 순서를 지정할 수 있습니다.

  1. (오른쪽, replace 수행 할 수 있습니다?) 기간을 삭제

  2. 나머지 그림 3 개 이상의 문자 경우, 첫 번째 문자 이후 0 (영)을 추가합니다.

이 나에게 내가 원하는 결과를 줄 것 같다 : 1.9109 될 것 110 앞에 오는; 1Z10Z이되며 1AA 앞에옵니다. 하지만 SQL로 할 수 있습니까? 그렇다면 구문은 무엇입니까?

설명 된 순서대로 쿼리 결과를 출력하기 위해 데이터 자체를 수정하고 싶지는 않습니다.

이것은 Wordpress 설치의 맥락에서 볼 수 있지만, PHP와는 달리 MySQL 질의 단계에서 일어나는 주문에 따라 페이지 설정과 같은 여러 가지 문제가 발생하기 때문에 질문을 더 적절하게 SQL 질문이라고 생각합니다.

+0

는 슬프게도, 나는 당신의 가장 좋은 건 설정에 대한 것이라고 생각하는 데 도움이 '1 => 1.1' 및'10 = 1.10'이되도록 조회 테이블을 만듭니다. – Kermit

+0

실제로 사용하고있는 값은 "1.1", "그림 1.1"또는 "그림 1.1 그림의 캡션"입니다. –

+1

그건 나쁜 생각이 아니 었나요? 하나의 선택 항목에서 숫자와 알파를 혼합하여 정렬 할 것입니까? 만약 그렇다면 우리는 1Z에 2.0이 뒤따라 온다고 주장 할 수 있습니까? –

답변

0

첫 번째 생각은 트리거 또는 다른 외부 메커니즘에 의해 업데이트되는 추가 열을 추가하는 것입니다.

으로 주문을 수행하려면 해당 열을 사용하십시오. 2) 메커니즘 업데이트에 관계없이 대리모가 받아 들일 수있는 주문을 만들 수있는 로직이 있어야합니다 (예 : 1.1을 AAA 또는 이와 비슷한 이름으로 변경).

어쨌든 ... 이것은 고통이 될 것입니다. 나는 너를 괴롭히지 않는다.

0
당신은

Alter FUNCTION [dbo].[GetHumanSortOrder] (@ColumnName VARCHAR(50)) 
RETURNS VARCHAR(20) 
AS 

BEGIN 
DECLARE @HumanSortOrder VARCHAR(20) 

SELECT @HumanSortOrder = 
CASE 
    WHEN (LEN(replace(replace(<Column_Name>,'.',''),'Figure ',''))) = 2 
THEN 
CONCAT (SUBSTRING(replace(replace(<Column_Name>,'.',''),'Figure ',''),1,1),'0',SUBSTRING(replace(replace(<Column_Name>,'.',''),'Figure ',''),2,2)) 
    ELSE 
     replace(replace(<Column_Name>,'.',''),'Figure ','') 
     END 
FROM <Table_Name> AS a (NOLOCK) 
WHERE <Column_Name> = @ColumnName 

RETURN @HumanSortOrder 

END 

이 기능과 같은 인간의 정렬 순서를 가지고 논리를 가지고 함수를 만들 수 있습니다

는 등

을 원하는 그리고 당신에 의해 순서로이 기능을 사용할 수 10410711910A, 10B처럼 당신을 줄

SELECT * FROM <Table_Name> ORDER BY GetHumanSortOrder(<Column_Name>) 

희망이

관련 문제