2012-08-07 3 views
5

내가 많은 데이터를 SQL 데이터베이스에 일부 테이블을 가지고 행의 몇 가지 예를 들어, 거의 동일 가정 내 목적을 위해sql table에서 비정상적인 distinct select를 수행하는 쿼리를 작성하는 방법은 무엇입니까?

|===========================================| 
|   Message       | 
|===========================================| 
|    ...       | 
|-------------------------------------------| 
| account is rejected: <aa>    | 
|-------------------------------------------| 
| account is rejected: <bb>    | 
|-------------------------------------------| 
| mailbox unavailable: 550 550 <[email protected]> | 
|-------------------------------------------| 
| mailbox unavailable: 550 550 <[email protected]> | 
|-------------------------------------------| 
|     ...      | 

이 개 첫 번째 라인이 동일하고 2 개 마지막 라인이 너무, 동일

  • 사서함을 사용할 수 없습니다 : (550) 550
  • 쿼리

    1. 계정이 거부 반환해야

      나는, 행을 선택 '<'기호 다음에 문자를 제거하고이 DISTINCT을 할 것입니다 것입니다 쿼리를 작성하는 생각,하지만 난 SELECT

      당신이 날은 쿼리를 작성하는 데 도움이 할 수있는 모든 그것에서 할 방법을 모른다 ?

    +1

    모든 메시지에'<'가 있습니까? 그리고 항상 * 처음부터 모든 것을 무시하고 싶습니까? – MatBailie

    +0

    @Dems, 모든 메시지가 '<' – theateist

    답변

    5

    다음은 첫 번째 <부터 모든 것을 제거합니다.

    GROUP BYDISTINCT을 사용하는 것보다 융통성이 있지만이 경우에도 동일한 결과를 얻습니다.

    <이없는 메시지의 가능성을 대비하기 위해 CASE 문이 있습니다. 이 항상 인 경우 < 다음 ELSE 섹션을 대신 사용하십시오.

    SELECT 
        CASE WHEN CHARINDEX('<', Message) = 0 THEN Message ELSE LEFT(Message, CHARINDEX('<', Message)-1)) END AS Message 
    FROM 
        yourTable 
    GROUP BY 
        CASE WHEN CHARINDEX('<', Message) = 0 THEN Message ELSE LEFT(Message, CHARINDEX('<', Message)-1)) END 
    
    +0

    +1 점을 갖지는 않습니다! :) –

    +0

    @Dems, select/case에서 regex를 사용할 수 있습니까? – theateist

    +0

    @theateist - 당신이 직접 쓴 것이 아니라면 TSQL을 사용하지 마십시오. 하지만 당신은 필요하지 않습니다. CHARINDEX()는 여러분이 필요로하는 것을합니다 ... – MatBailie

    관련 문제