0

おはようございます。いくつかの行にセミコロンで区切られた複数の電子メールを含む電子メール列がテーブルにあります。実際、私はこのクエリでメールを取得しようとしています

-- cdu_mail is the column

select
    ltrim(rtrim(cdu_mail)),
    substring(ltrim(RTRIM(cdu_mail)), 0, charindex(';',ltrim(RTRIM(cdu_mail)))) 
FROM Clientes

行に複数のメールがある場合、クエリは最初のメールを正しく取得しますが、行にメールが 1 つしかない場合、結果は空白になります。

ここに画像の説明を入力

すべてのメールを正しく取得するには、何を変更する必要がありますか?

ありがとうございました。

4

4 に答える 4

3

列の最後にセミコロンを追加して、セミコロンが常に存在することを保証し、case 式の使用を避けることもできます。

select     ltrim(rtrim(cdu_mail)),     
    substring(ltrim(RTRIM(cdu_mail)), 0, charindex(';',ltrim(RTRIM(cdu_mail + ';')))) 
FROM #Clientes 
于 2012-09-04T14:15:24.680 に答える
1

これを case ステートメントに入れることができます。

select (case when cdu_email like '%;'
             then ltrim(rtrim(cdu_mail)), substring(ltrim(RTRIM(cdu_mail)), 0,
                                                    charindex(';',ltrim(RTRIM(cdu_mail))))
             else cdu_email
        end) as firstEmail
from Clientes

問題は、1 つのメールが「;」で終わらないため、charindex() が 0 を返すことです。

特定の検索にもセミコロンを追加することで、これを解決することもできます。

select ltrim(rtrim(cdu_mail)), substring(ltrim(RTRIM(cdu_mail)), 0,
                                         charindex(';',ltrim(RTRIM(cdu_mail+';'))))
from Clientes
于 2012-09-04T14:12:37.817 に答える
1
    select  case when charindex(';', cdu_mail) = 0 then cdu_mail else
                    substring(cdu_mail,1, charindex(';', cdu_mail) - 1) end
    from    clientes
于 2012-09-04T14:14:51.457 に答える
0

使用している SQL 構文のバージョンはわかりませんが、MySQL では次のようなことができます。

SELECT 
    IF( LOCATE(  ";", TRIM( cdu_mail ) ) >1, LEFT( TRIM( cdu_mail ), 
    LOCATE(  ";", TRIM( cdu_mail ) ) -1 ), 
    TRIM( cdu_mail ) ) AS email
FROM Clientes

事実上、「;」がある場合は最初のメールを選択し、そうでない場合はフィールドの値を取得します (メールは 1 つしかないため)。

WHERE 句を使用して NULL 値のチェックを導入することもできます。

HTH

于 2012-09-04T14:26:06.230 に答える