지난 며칠 동안 자연 순서대로 영숫자 텍스트 목록을 정렬하려고 시도했습니다. NLS_SORT 옵션을 사용하면 목록을 올바르게 정렬 할 수 있습니다 (see this answer). . 그러나 그 해결책을 시험해 볼 때 나는 아무런 차이가 없다는 것을 발견했다. 목록은 정상적인 ORDER BY 쿼리와 같이 계속 표시되었습니다. 제게는 solution involving regex을 사용할 수 없습니다.영숫자 텍스트의 이진 정렬이 자연 정렬되지 않음
테스트 목적으로 테이블을 만들어 일부 데이터로 채 웁니다. SELECT name FROM test ORDER BY name ASC
을 실행할 때 나는 다음과 같은 결과를 얻을 :
을 당신이 순서가 부자연시피. 그것은 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
과 같아야합니다.
해결책은 nls_sort 옵션 설정과 관련이 있습니다.
ALTER SESSION SET nls_sort='BINARY'; -- or BINARY_AI
SELECT name FROM test ORDER BY NLSSORT(name,'NLS_SORT=BINARY') -- or BINARY_AI
IT는 ASCII table에 명시된 바와 같이 각 문자의 진수 코드를 기반으로 목록의 텍스트를 주문해야합니다. 그래서 나는 올바른 방법 (테이블의 순서가 '공백', '점', 숫자, 문자)으로 바뀌기를 기대했지만 아무 것도 바뀌지 않았습니다. 주문은 여전히 이미지와 동일합니다. 그 다음 정렬 순서는 각 문자의 숫자 값을 기준으로 BINARY, 그래서는 데이터베이스 문자에 의존 있다면
설정 내가 '문자 집합 함께 할 수있는 뭔가가있을
내가 사용하고 있지만, 나는 그걸로 무슨 잘못 모르겠어요. SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET';
을 실행하면 AL32UTF8
값이 표시됩니다. 어느 쪽이 UTF8의 약간 확장 된 버전처럼 보입니다 (내가 틀렸다면 정정 해주세요). Oracle 데이터베이스 버전 11.2.0.4.0에서 실행됩니다.
아무도 내가 잘못하고있는 부분이나 내가 누락 된 부분을 말할 수 있습니까?
미리 감사드립니다.
왜 순서는 1,2,3되는 것이 자연이다 ... 오히려 1,10,100 이상? 문자 (본질적으로)에 의해 문자열을 보았 기 때문에,'10' 앞에 정확하게'1'을 넣고 있습니다. 두 번째 문자의 값은 첫 번째 문자의 정렬 방식에는 영향을주지 않습니다. 그'nlssort (name)'문자열을 보자. 정규식을 사용할 수없는 이유는 무엇입니까? –
소프트웨어 측면에서는 정상입니다. 하지만 나는 인간이 읽을 수있는 방식으로 '정상적인'정렬을 의미했다. (미안하다.) 예를 들어 Windows 탐색기를 가져 가십시오. 해당 파일의 버전 역할을하는 숫자가 포함 된 파일을 정렬 할 때 오름차순으로 정렬하거나 내림차순으로 정렬 할 때 목록의 맨 아래에 상위 버전이 있어야합니다. –