오름차순 관련 질문드립니다. 0 7 146

by 준일정 [SQL Query] [2019.03.14 13:44:29]



WITH t AS
(

select '1.5층' id 
union all select '1층'
union all select '1층'

)


SELECT id
FROM t
order by id 

 

이렇게 하면 

1층

1층

1.5층 이렇게 정렬이 되어야 할 거 같은데 

 

1.5층

1층

1층 

이렇게 정렬이 됩니다.. 

근데 desc로 놓으면 

 

1층

1층 

1.5층

 

이렇게 정렬이 되는데 

문제는 여기에 

3층이 추가됬을 경우입니다. 

 


WITH t AS
(

select '1.5층' id 
union all select '1층'
union all select '1층'
union all select '3층'
)


SELECT id
FROM t
order by id 

1.5층
1층
1층
3층

이렇게 정렬이 되고 

내림차순으로 할 경우에는

3층
1층
1층
1.5층

이렇게 정렬이 되는데.,.... 

해결 방법이 없을까요?

by 마농 [2019.03.14 13:50:05]

ORDER BY TO_NUMBER(REPLACE(id, '층'))


by 준일정 [2019.03.14 13:54:28]

mssql인데 mssql은 replace의 인수가 3개인데... 방법이 없을까요?

 

궁금한건 왜 저렇게 되는지도 알고 싶어요 


by 우리집아찌 [2019.03.14 13:58:26]
WITH t AS
(

select '1.5층' id 
union all select '1층'
union all select '1층'
union all select '3층'
)


SELECT id
  FROM t
ORDER BY CAST(REPLACE(id, '층','') AS FLOAT )

 


by 준일정 [2019.03.14 14:02:31]

대..박 이렇게도 되는군요


by 신이만든지기 [2019.03.14 14:02:40]

order by convert(float, replace(id, '층', ''));

'1층'과 '1.5층' 의 문자열 순서를 비교할 때, '1'은 서로 같으므로 그 뒷자리 '층'과  '.'의 순서를 가려야됩니다. '.'이라는 문자열이 '층'보다 앞서기 때문에 문자열로 정렬하면 '1.5층'이 먼저나오게 되죠.

이를 숫자로 변환하여 정렬시키면 질문자님이 원하시는 정렬순서가 나오게 되는 겁니다.

 


by 마농 [2019.03.14 14:03:43]

문자정렬과 숫자정렬의 방식이 다릅니다.
숫자는 그 자체로 크기가 정해져 있죠. 1 이나 1.5 나
그러나 문자의 경우엔 한글자씩 순서대로 아스키코드값으로 비교해야 합니다.
'9층' 과 '10층' 을 비교하면 앞자리 '9' 가 '1' 보다 크므로 '9층' 보다 '10층' 이 큰걸로 나옵니다.


by 준일정 [2019.03.14 15:09:32]

답변 감사합니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입