2010-12-19 4 views
-1

STORY_LENGTH이라는 필드 (문자열 데이터 유형)로 레코드 순서를 정렬한다고 가정합니다. 이 필드는 다중 값 필드이며 쉼표를 사용하여 여러 값을 나타냅니다. 예를 들어, record1의 경우 값은 "1"이고 record2의 값은 "1,3"이고 record3의 경우 값은 "1,2"입니다. 이제는 STORY_LENGTH에 따라 레코드를 주문하려고하는데 다음과 같은 레코드가 주문됩니다. record1 > record3 > record2. STORY_LENGTH 데이터 유형이 문자열이고 그 값을 order by ASC이 문자열로 간주하는 것이 분명합니다. 그러나 여기에 문제가 있습니다. 예를 들어 record4="10"record5="2"을 주문하려고하면 분명히 원하지 않는 record4 > record5처럼 보입니다. 2 > 10 및 필드의 여러 값 때문에 서식이 지정된 문자열을 사용하고 있기 때문에. 아무도, 당신이 나를 도울 수 있습니까? 나는 고칠 좋은 생각이 필요해. 감사합니다.order by 절에서 문자열 정렬을 처리하는 방법은 무엇입니까?

+1

디자인을 수정하십시오. 단순한. – gbn

답변

5

설명하는대로 다중 값 필드는 데이터 모델이 손상되었음을 의미하며 normalized이어야합니다.

이 작업이 완료되면 쿼리가 훨씬 간단 해집니다.

+0

필드에는 동일한 유형의 여러 값이 포함됩니다. 예를 들어 곡의 길이는 두 가지가 될 것입니다 : 10,15 또는 10과 같은 싱글. 현재 db 디자인은 변경 될 수없는 상황입니다. –

+0

@Masud Rahman - 이것은 불행합니다. LIKE 연산자를 사용하고 DB가 아닌 응용 프로그램에서 문자열 조작 및 필터링을 수행하여 솔루션을 살펴볼 수 있습니다. 덕분에 – Oded

0

VARCHAR 필드에 저장된 값을 쉼표로 구분하여 두 번째 또는 첫 번째 숫자로 항목을 정렬하고 싶습니다. 구현은 같을 것이다 MySQL은, 예를 들어, 사용되는 데이터베이스에 따라 달라집니다 :

SELECT * FROM stories 
ORDER BY CAST(COALESCE(SUBSTRING_INDEX(story_length, ',', -1), '0') AS INTEGER) 

그러나 전체 테이블 스캔을 필요로 정렬 인덱스 대신에 사용하는 같은 성능 향상을 위해 정렬 등의 사용 일반적으로 좋지 않다 아니다 들.

편집 : 편집 후 첫 번째 값을 정렬하고 쉼표 뒤에 값을 무시하려는 것처럼 보입니다. 위의 몇 가지 코멘트에 따르면 데이터베이스 디자인의 변경 사항은 정렬을 위해 다음 코드를 사용하는 옵션이 아닙니다.

SELECT * FROM stories 
ORDER BY CAST(COALESCE(NULLIF(SUBSTRING_INDEX(story_length, ',', 1), ''), '0') AS INTEGER) 
+0

. 좋아 보인다. 나는 이것을 시도하고 피드백을 줄 것이다. –