programing

SQL 순서 문자열(숫자)

kingscode 2023. 1. 22. 22:38
반응형

SQL 순서 문자열(숫자)

로 저장된 번호가 있습니다.VARCHARMySQL my my my my my my 。는 그것들을 수 .INT른른른른른른

분류할 때 숫자가 아닌 문자로 받아들입니다.

데이터베이스에는

1 2 3 4 5 6 7 8 9 10...

내 페이지에는 다음과 같은 순서 목록이 표시됩니다.

1 10 2 3 4 5 6 7 8 9

오름차순으로 표시하려면 어떻게 해야 하나요?

숫자만 저장할 경우 가능하면 열의 데이터 유형을 숫자로 변경해야 합니다.

이 작업을 수행할 수 없는 경우 열 값을 다음과 같이 지정합니다.integer 가지고 분명히

select col from yourtable
order by cast(col as unsigned)

또는 암묵적으로 예를 들어 숫자로 변환하도록 강제하는 수학적 연산을 사용하는 경우

select col from yourtable
order by col + 0

BTW MySQL은 문자열을 왼쪽에서 오른쪽으로 변환합니다.예:

string value  |  integer value after conversion
--------------+--------------------------------
'1'           |  1
'ABC'         |  0   /* the string does not contain a number, so the result is 0 */
'123miles'    |  123 
'$123'        |  0   /* the left side of the string does not start with a number */

다른 방법으로는, 깁스 하나 없이.

(주조가 불가능한 JPA 2.0을 사용하는 분)

select col from yourtable
order by length(col),col

EDIT: 양의 정수에서만 작동합니다.

다른 간단한 방법

ORDER BY ABS(column_name)

제가 분류하고 있는 칼럼은 영숫자와 영숫자의 조합이 있기 때문에, 이 투고의 제안을 기점으로 삼아 이것을 생각해 냈습니다.

DECLARE @tmp TABLE (ID VARCHAR(50));
INSERT INTO @tmp VALUES ('XYZ300');
INSERT INTO @tmp VALUES ('XYZ1002');
INSERT INTO @tmp VALUES ('106');
INSERT INTO @tmp VALUES ('206');
INSERT INTO @tmp VALUES ('1002');
INSERT INTO @tmp VALUES ('J206');
INSERT INTO @tmp VALUES ('J1002');

SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum
FROM @tmp
ORDER BY IsNum, LEN(ID), ID;

결과.

ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002

도움이 되었으면 좋겠다

난 이거면 돼.

select * from tablename
order by cast(columnname as int) asc

같은 솔루션을 찾고 있는 사람에게 도움이 될 수 있습니다.

select * from tablename ORDER BY ABS(column_name)

변환하는 또 다른 방법.

문자열 필드가 있는 경우 다음과 같이 변환하거나 숫자 부분을 변환할 수 있습니다. 선행 0을 추가하여 모든 정수 문자열이 동일한 길이를 갖도록 합니다.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( stringfield ) ) , stringfield ) 

또는 필드의 일부에 따라 'hymbols13', 'hymbols1222' 등을 주문합니다.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) ) 

문자 접두사가 있는 정렬 필드도 찾고 있었습니다.이게 내가 찾은 해결책이야.이것은 같은 솔루션을 찾고 있는 사용자에게 도움이 될 수 있습니다.

필드 값:

FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789

select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc

SUBSTRING(field,3,9)9는 최대 9자리 정수값을 보유하기에 충분하기 때문에 9를 입력합니다.

따라서 결과는 123456789 123456788 123456787...100 99...2 1이 됩니다

음수, 분수, 문자열 등 모든 것을 처리합니다.

ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;

Adonis를 사용하는 경우ABC-202, ABC-201 등의 ID가 혼재된 JS에서는 raw 쿼리를 Query Builder와 결합하여 위의 솔루션을 구현할 수 있습니다(https://stackoverflow.com/a/25061144/4040835):

const sortField =
  'membership_id'
const sortDirection =
  'asc'
const subquery = UserProfile.query()
  .select(
    'user_profiles.id',
    'user_profiles.user_id',
    'user_profiles.membership_id',
    'user_profiles.first_name',
    'user_profiles.middle_name',
    'user_profiles.last_name',
    'user_profiles.mobile_number',
    'countries.citizenship',
    'states.name as state_of_origin',
    'user_profiles.gender',
    'user_profiles.created_at',
    'user_profiles.updated_at'
  )
  .leftJoin(
    'users',
    'user_profiles.user_id',
    'users.id'
  )
  .leftJoin(
    'countries',
    'user_profiles.nationality',
    'countries.id'
  )
  .leftJoin(
    'states',
    'user_profiles.state_of_origin',
    'states.id'
  )
  .orderByRaw(
    `SUBSTRING(:sortField:,3,15)*1 ${sortDirection}`,
    {
      sortField: sortField,
    }
  )
  .paginate(
    page,
    per_page
  )

메모: 다음 행:SUBSTRING(:sortField:,3,15)*1 ${sortDirection} ,

  1. '3'은 숫자 앞에 있는 마지막 문자 이외의 색인 번호를 나타냅니다.혼합 ID가 "ABC-123"인 경우 인덱스 번호는 4가 됩니다.
  2. '15'는 하이픈 뒤에 가능한 한 많은 숫자를 잡기 위해 사용됩니다.
  3. "1"은 서브스트링을 효과적으로 숫자에 캐스팅하는 서브스트링에 대한 수학 연산을 실시한다.

참조 1: 파라미터 바인딩에 대한 자세한 내용은 https://knexjs.org/ #Raw-Bindings 참조 2: Adonis Raw Queries: https://adonisjs.com/docs/4.1/query-builder#_raw_queries 를 참조하십시오.

필드를 VARCHAR 대신 INT로 변경합니다.

다른 사정으로 인해 INT로 만들 수 없습니다.

그럼 상황에 따라 먼저 해결하세요.그렇지 않으면 진짜 근본적인 문제를 해결할 수 있습니다.MySQL CAST를 사용하는 것은 옵션이지만 수정해야 할 잘못된 스키마를 마스킹합니다.

언급URL : https://stackoverflow.com/questions/11808573/sql-order-string-as-number

반응형