2

複数の電子メールを SQL Server テーブル セルに挿入したいのですが、それらを挿入する前に、値が既に存在するかどうかを確認する必要があります。

より明確にするために

Row_id        EMAIL_ID
  1           abc@xyz.com,abcabc@xyz.com, abc2@xyz.com
  2           pqr@xyz.com,pqrabc@xyz.com

を挿入するabcabc@xyz.com,free@xyz.comと、値が重複していることがわかります。

これは私がしました

select EMAIL_ID
from TR_DEMO
INNER JOIN dbo.split('abcabc@xyz.com,free@xyz.com', ',') s
ON s.items IN (select items from dbo.split(EMAIL_ID, ',') )

関数

CREATE FUNCTION [dbo].[Split]
(
    @String varchar(8000), 
    @Delimiter char(1)
)       
returns @temptable TABLE (items varchar(8000))       
as       
begin       
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(rtrim(ltrim(@slice)))       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return       
end 

正常に動作しますが、100000 前後のレコードをチェックしている間、クエリが遅くなります

ワイルドカードなどで同じことができますか?

4

2 に答える 2

5

コンマ区切りのリストと比較するために使用できるトリックがあります。まず、入力リストを分割します。次に、各項目について、次のことを確認します。

SELECT EMAIL_ID
  FROM TR_DEMO
 WHERE ','+EMAIL_ID+',' LIKE '%,abcabc@xyz.com,%'

デモ: http://www.sqlfiddle.com/#!3/6dd71/2

SPLITメソッドを使用してアイテムを生成する別の例を次に示します。

    SELECT EMAIL_ID
      FROM TR_DEMO T
INNER JOIN dbo.split('abcabc@xyz.com,free@xyz.com', ',') s
               ON ','+T.EMAIL_ID+',' LIKE '%,'+s.items+',%'

http://www.sqlfiddle.com/#!3/a9a7b/1

于 2012-08-23T12:50:00.413 に答える
0

よし、これはどうだ

declare @EmailsToInsert varchar(max) = 'abcabc@xyz.com,free@xyz.com'

declare @insertdata table (email varchar(max))
insert into @insertdata select items from dbo.split(@EmailsToInsert, ',')

-- remove any trailing spaces
update tr_demo
set email_id = replace(email_id, ' ', '')

update t
set email_id = t.email_id + ',' + i.email
from tr_demo t
inner join @insertdata i on ',' + t.email_id + ',' not like '%,' + i.email + ',%' 
  • 文字列を分割して一時テーブルに挿入します (ここではテーブル変数を使用しました)。
  • email_id フィールドの末尾のスペースを削除します
  • メールがカンマで囲まれていると仮定して、データ テーブルと一時テーブルの結合に基づいて更新します。結合の一部として、email_id の開始と終了にカンマが追加されていることに注意してください。

テーブル var を使用した実際の例を次に示します。

declare @data table (row_id int, email_id varchar(max))
insert into @data values 
(1, 'abc@xyz.com,abcabc@xyz.com, abc2@xyz.com'),
(2, 'pqr@xyz.com,pqrabc@xyz.com')

declare @EmailsToInsert varchar(max) = 'abcabc@xyz.com,free@xyz.com'

declare @insertdata table (email varchar(max))
insert into @insertdata select items from dbo.split(@EmailsToInsert, ',')

update @data
set email_value = replace(email_value, ' ', '')

update t
set email_value = t.email_value + ',' + i.email
from @data t
inner join @insertdata i on ',' + t.email_value + ',' not like '%,' + i.email + ',%' 

select * from @data
于 2012-08-23T12:58:05.510 に答える