복붙노트

[SQL] 수와 같은 SQL 위해 문자열

SQL

수와 같은 SQL 위해 문자열

내가 MySQL 데이터베이스에 VARCHAR로 저장할 수 있습니다. 나는 때문에 다른 따라 상황에 INT 할 수 없습니다.

정렬하는 동안은 문자가 아닌 같은 수로를하고있다.

데이터베이스에서 나는이

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

내 페이지에이 같은 목록을 정렬 보여줍니다 :

1 10 2 3 4 5 6 7 8 9

어떻게하면 오름차순 번호로 주문 표시 할 수 있습니다?

해결법

  1. ==============================

    1.당신은 숫자에 열의 데이터 형식을 변경해야 가능한 경우 만 어쨌든 번호를 저장합니다.

    당신은 숫자에 열의 데이터 형식을 변경해야 가능한 경우 만 어쨌든 번호를 저장합니다.

    당신이 할 수없는 경우 명시 적으로 정수로 열 값을 캐스팅

    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 */
    
  2. ==============================

    2.또 다른 방법은, 하나의 캐스트를 사용하지 않고.

    또 다른 방법은, 하나의 캐스트를 사용하지 않고.

    (어떤 캐스팅이 허용되지 않습니다 JPA 2.0을 사용하는 사람들의 경우)

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

    편집 : 양의 정수에 대해서만 작동

  3. ==============================

    3.내가 시작 지점으로이 게시물의 제안을 사용하고이 함께했다 그래서 내가 함께 정렬하고있어 열은 알파와 숫자의 조합을 가지고있다.

    내가 시작 지점으로이 게시물의 제안을 사용하고이 함께했다 그래서 내가 함께 정렬하고있어 열은 알파와 숫자의 조합을 가지고있다.

    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
    

    도움이 되었기를 바랍니다

  4. ==============================

    4.또 다른 간단한 방법

    또 다른 간단한 방법

    ORDER BY ABS (COLUMN_NAME)

  5. ==============================

    5.변환하는 또 다른 방법.

    변환하는 또 다른 방법.

    당신이 문자열 필드가있는 경우, 당신은 그것을 또는 숫자 부분을 다음과 같은 방법을 변환 할 수 있습니다 : 동일한 길이를 가지는 모든 정수 문자열을 만들기 위해 앞에 0을 추가합니다.

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

    또는 주문 'tensymbols13'와 같은 필드 뭔가의 일환으로, 'tensymbols1222'등

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

    6.이것은 나를 위해 작동합니다.

    이것은 나를 위해 작동합니다.

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

    7.또한 편지 접두사가있는 정렬 필드를 찾고 있었다. 여기에 내가 해결책을 찾을 것입니다. 동일한 솔루션을 찾고이 힘 도움이됩니다.

    또한 편지 접두사가있는 정렬 필드를 찾고 있었다. 여기에 내가 해결책을 찾을 것입니다. 동일한 솔루션을 찾고이 힘 도움이됩니다.

    필드 값 :

    FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789
    
    select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc
    

    9 나를 값의 정수 최대 9 개 자리를 유지하기위한 방법으로 충분하기 때문에 문자열 (필드, 3,9)의 난 (9)을 넣어.

    결과가 될 것입니다 그래서 123456789 123456788 123456787 ... (100) 99 ... 이 1

  8. ==============================

    8.이것은 음수, 분수, 문자열, 모든 것을 처리합니다 :

    이것은 음수, 분수, 문자열, 모든 것을 처리합니다 :

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

    9.이 같은 솔루션을 찾고 누가 도움이 될 수 있습니다.

    이 같은 솔루션을 찾고 누가 도움이 될 수 있습니다.

    select * from tablename ORDER BY ABS(column_name)
    
  10. ==============================

    10.당신이 AdonisJS를 사용하는 등 ABC-202, ABC-201 ... 등의 혼합 된 ID가있는 경우, 당신은 쿼리 빌더와 함께 원시 쿼리를 결합하고 위의 솔루션을 구현할 수 있습니다 (https://stackoverflow.com/a/25061144/4040835) 로 다음과 같습니다 :

    당신이 AdonisJS를 사용하는 등 ABC-202, ABC-201 ... 등의 혼합 된 ID가있는 경우, 당신은 쿼리 빌더와 함께 원시 쿼리를 결합하고 위의 솔루션을 구현할 수 있습니다 (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 참고 : 현재 원시 쿼리에서 매개 변수 바인딩에 대한 자세한 읽을 수 있습니다 https://knexjs.org/#Raw-Bindings 2 참고 : 아도니스 원시 쿼리 : https://adonisjs.com/docs/4.1/query-builder#_raw_queries

  11. ==============================

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

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

    그런 다음 먼저 따라 상황을 해결. 그렇지 않으면 당신은 진짜 근본적인 문제를 해결 노력하고 있습니다. MySQL 데이터 CAST를 사용하는 것은 선택 사항이지만, 고정되어야한다 나쁜 스키마를 마스킹합니다.

  12. from https://stackoverflow.com/questions/11808573/sql-order-string-as-number by cc-by-sa and MIT license