2012-08-07 39 views
5

は私が多くデータをSQLデータベース内のいくつかのテーブルを持っていると行のいくつかはほとんど同じで、例えばとしますSQLテーブルから珍しい選択を行うクエリを書く方法は?

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

私の目的のためにそう、2つの最初の行は同一であり、2つの最後の行が同一であります

  • メールボックス使用できません:550 550
  • クエリが

    1. アカウントが拒否され返す必要があります

      あなたは、このようなクエリを記述するために私を助けることができる私は、行を選択しますクエリを記述「<」記号の後に文字を排除し、DISTINCTを行いますと考え、私はSELECT

      にすべてをどのように行うのか分かりません?

    +1

    すべてのメッセージに '<'が付きますか?そして、あなたはいつも最初から最後まですべてを無視したいのですか? – MatBailie

    +0

    @Dems、すべてのメッセージに '<' – theateist

    答えて

    5

    以下は、最初の<からすべてを削除します。

    GROUP BYは、DISTINCTを使用するよりも柔軟ですが、この場合も同じことが成立します。

    の文には、<のメッセージがない可能性があります。 の場合は常にとなります。<の場合は、代わりに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

    関連する問題