복붙노트

[SQL] SQL : 특정 열 ... 가능한 내에서 문자열을 사용하여 ORDER?

SQL

SQL : 특정 열 ... 가능한 내에서 문자열을 사용하여 ORDER?

나는 그의 열 npID, 제목, URL 및 문제가있는 데이터베이스를 가지고있다.

여기에 2 년 항목의 예입니다 :

npID               title               URL               issue
88                 EMR Newsletter      a.com             2010 Third_Quarter
89                 EMR Newsletter      b.com             2010 Second_Quarter
43                 EMR Newsletter      c.com             2010 First_Quarter
47                 EMR Newsletter      d.com             2009 Winter
45                 EMR Newsletter      e.com             2009 Summer
46                 EMR Newsletter      f.com             2009 Spring
44                 EMR Newsletter      g.com             2009 Fall

내가 뭘하고 싶은 것은 "문제"열 내의 문자열을 기준으로 결과를 정렬 할 수 있습니다. 그러나, 2010 년까지, 클라이언트는 헤더로 시즌을 사용하고 2010 년에, 그들은 분기를 사용하기 시작했습니다. 있는 방법 "에 의해 ORDER"는에 거기에 나는 그들이 어디서든 "문제"값을 발견 할 때 / 경우 정렬 기준으로 단어의 목록을 제공 할 수 있습니까?

나는이 같은 것으로 최종 결과를 좋아하는 것 :

npID               title               URL               issue
43                 EMR Newsletter      c.com             2010 First_Quarter
89                 EMR Newsletter      b.com             2010 Second_Quarter
88                 EMR Newsletter      a.com             2010 Third_Quarter
47                 EMR Newsletter      d.com             2009 Winter
45                 EMR Newsletter      e.com             2009 Summer
46                 EMR Newsletter      f.com             2009 Spring
44                 EMR Newsletter      g.com             2009 Fall

해결법

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

    1.이 작업을 수행 할 주문 BY에 CASE 문을 넣을 수 있습니다. 더 나은 경로는 실제에 응용 프로그램 및 테이블을 변경 당신이 할 수있는 개발 시간이있을 때 자신이 속한 곳 열이 관련 데이터를 저장하는 것입니다.

    이 작업을 수행 할 주문 BY에 CASE 문을 넣을 수 있습니다. 더 나은 경로는 실제에 응용 프로그램 및 테이블을 변경 당신이 할 수있는 개발 시간이있을 때 자신이 속한 곳 열이 관련 데이터를 저장하는 것입니다.

    ORDER BY
        CAST(SUBSTRING(issue, 1, 4) AS INT) DESC,  -- Year
        CASE
            WHEN issue LIKE '%First_Quarter' OR issue LIKE '%Winter' THEN 1
            WHEN issue LIKE '%Second_Quarter' OR issue LIKE '%Spring' THEN 2
            WHEN issue LIKE '%Third_Quarter' OR issue LIKE '%Summer' THEN 3
            WHEN issue LIKE '%Fourth_Quarter' OR issue LIKE '%Fall' THEN 4
        END
    

    당신이 원하는 그러나 계절을 주문. 또한 CASE 문을 조정하여 (Q2 다음에 봄 다음 Q1, 등) 특정의 방식으로 주문할 수 있습니다.

  2. ==============================

    2.순서에의 CASE 문을보십시오 :

    순서에의 CASE 문을보십시오 :

    SELECT npID, title, URL, issue
    FROM   tbl
    ORDER  BY substring(issue, 1, 4) DESC
          ,CASE 
              WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter')  THEN 1
              WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2
              WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter')  THEN 3
              WHEN substring(issue, 6, 100) IN ('Fall',  'Fourth Quarter') THEN 4
              ELSE 5 
           END;
    

    묻지 마세요, 왜 겨울 -> 여름 -> 봄이 -는 클라이언트가 원하는거야! :)

    식을 한 번만 평가 이후 A "간단한"CASE 더 수행해야합니다. 오른쪽 (문제는 -5) 비트 속도 (문제, 6, 100)는 substring 같지만 :

    SELECT npid, title, url, issue
    FROM   tbl
    ORDER  BY left(issue, 4) DESC
          ,CASE right(issue, -5)
              WHEN 'Winter'         THEN 1
              WHEN 'First_Quarter'  THEN 1
              WHEN 'Summer'         THEN 2
              WHEN 'Second_Quarter' THEN 2
              WHEN 'Spring'         THEN 3
              WHEN 'Third_Quarter'  THEN 3
              WHEN 'Fall'           THEN 4
              WHEN 'Fourth Quarter' THEN 4
              ELSE 5 
           END;
    

    왼쪽 ()과 오른쪽 ()는 PostgreSQL의 9.1에 추가되었습니다. 권리와 트릭 ()는 왼쪽에서 문자의 일정 번호를 트림 음의 번호를 사용하는 것입니다.

    이들은 (<= 100 개 문자의 문자열) 동일 :

    SELECT substring(issue from 6 for 100) AS substring1
          ,substring(issue, 6, 100)        AS substring2
          ,substring(issue, 6)             AS substring3
          ,substr(issue, 6, 100)           AS substr1
          ,substr(issue, 6)                AS substr2
          ,right(issue, -5)                AS right0
    FROM tbl
    

    -> sqlfiddle

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

    3.여기에 같은 주제의 변형입니다

    여기에 같은 주제의 변형입니다

    ORDER BY
        SUBSTRING(issue,1,4) Desc,
    
    CASE SUBSTRING(issue,6, LEN(issue) - 5)
       WHEN 'First_Quarter' THEN 1
       WHEN 'Second_Quarter' THEN 2
       WHEN 'Second_Quarter' THEN 3
       WHEN 'Winter' then 1
       WHEN 'Spring' then 2
       WHEN 'Summer' then 3
       WHEN 'Fall' then 4
    END
    
  4. ==============================

    4.예, 당신은 SQL 명령 어디서나 경우 / 다음 구조를 사용할 수 있습니다.

    예, 당신은 SQL 명령 어디서나 경우 / 다음 구조를 사용할 수 있습니다.

    당신은 이미 당신을 위해 작동하는 문자열 패턴이 있습니까? 그렇다면, 당신이 뭔가를 같이 사용할 수 있습니다 :

    ORDER BY (IF (SUBSTRING(first_match_of_issue) IS NOT NULL) THEN first_match_of_issue ELSE second_match_of_issue))
    

    그러나 - 당신은 이미 그들이있을거야 알고 있다면, 다른 답변에서 언급 한 CASE 문은 아마 쉽다.

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

    5.이 방법을 (이 T-SQL에) 시도 :

    이 방법을 (이 T-SQL에) 시도 :

    select
            *
        from
            your_table as t
        order by
            substring([issue], 1, 4) desc,
            case substring([issue], 6, len([issue]) - 5)
                when 'First_Quarter' then 1
                when 'Second_Quarter' then 2
                when 'Third_Quarter' then 3
                when 'Fourth_quarter' then 4
                when 'Spring' then 3
                when 'Summer' then 2
                when 'Fall' then 4
                when 'Winter' then 1
                else 5 -- show unexpected input last
            end asc
    
  6. ==============================

    6.당신은 데이터의 하위 문자열 부분을 선택하고 만들 수

    당신은 데이터의 하위 문자열 부분을 선택하고 만들 수

    SELECT npId, title, URL, issue, SUBSTRING(issue, 4) AS strsort FROM tbl ORDER BY strsort, issue
    
  7. ==============================

    7.

    SELECT Column1, row_number() over(order by substring(column2,280,9)) 
    FROM YourTable 
    

    이 2 열 하위 문자열의에 의해 순서를 제공 할 것입니다.

  8. from https://stackoverflow.com/questions/8187828/sql-order-by-using-a-substring-within-a-specific-column-possible by cc-by-sa and MIT license