2016-04-12 4 views
0

データベースにポストコードを挿入しようとしていますが、アンダースコアを取り除こうとしています。 私は、彼らが挿入されます前にフィールドをマップするために使用されFeedDataSetMappingと呼ばれる表している:アンダースコアを空白で置換する方法SQLで正規表現を使用する

INSERT INTO FeedDataSetMapping (

    [source_field] 
    ,[database_field] 
    ,[template_id] 
    ,[conversion_id] 
    ,[order_id] 
    ,[values_group] 
    ,[direct_value] 
    ,[value_regex] 
    ,[condition_regex] 
    ,[split_separator] 
    ,[enclosing_character] 
    ,[cumulative_field] 
    ,[cumulative_format]) 
    VALUES 
    ('manufacturerId','manufacturer_Id',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('dealership','leasing_broker_name',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('manufacturersDealerId','supplier_ref',@template_id,0,0,null,null,19,null,null,null,null,null), 
    ('address1','address1',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('address2','address2',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('postcode','post_code',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('telephone','telephone',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('fax','fax_number',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('email','email',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('website','web_address',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('NewCarSales','service_mask',@template_id,0,0,null,1,null,'^(?!(?i:^0$|^n$|^no$|^f$|^false$|^$))',null,null,1,null), 
    ('UsedCarSales','service_mask',@template_id,0,0,null,2,null,'^(?!(?i:^0$|^n$|^no$|^f$|^false$|^$))',null,null,1,null), 
    ('Servicing','service_mask',@template_id,0,0,null,8,null,'^(?!(?i:^0$|^n$|^no$|^f$|^false$|^$))',null,null,1,null), 
    ('Repairs','service_mask',@template_id,0,0,null,16,null,'^(?!(?i:^0$|^n$|^no$|^f$|^false$|^$))',null,null,1,null), 
    ('Longitude','longitude',@template_id,0,0,null,null,null,null,null,null,null,null), 
    ('Latitude','latitude',@template_id,0,0,null,null,null,null,null,null,null,null) 

これは、すでに場合には、このフィールドは、それは、それぞれtrueまたはfalseに変換いくつかのテキストが含まれていることをいくつかの条件の正規表現が含まれています。 私が必要とするのは、これらのアンダースコアを取り除き、空白スペースで置き換えるcondition_regexです。つまり、'GDB_A45''GDB A45'です。私は正規表現についてあまり知らないので、どんな考えも大いに評価されるでしょう。前もって感謝します!

+2

タグdbmsが使われました。 (そのコードは製品固有です) – jarlh

+1

大括弧で囲まれたSQL Serverのように見えますが、これはRegExサポートが不十分です。 – trincot

+0

これは本当にSQLサーバーです – Tofetopo

答えて

4

SQL Serverには正規表現のサポートはほとんどありませんが、この場合は必要とは思われません。

UPDATE mytable 
SET mycolumn = REPLACE(mycolumn, '_', ' ') 
WHERE mycolumn LIKE '%[_]%' 

をあなたはINSERT ... VALUESの代わりにINSERT ... SELECTを使用することができます更新しながら、これを行うには:あなたはシンプルに取って代わる行うことができます

INSERT INTO mytable (mycolumn) 
SELECT REPLACE('my data 1', '_', ' ') UNION 
SELECT REPLACE('my data 2', '_', ' ') UNION 
SELECT REPLACE('my_data_3', '_', ' ') UNION 
... 

あなたが分割する必要がありますので、あなたが行うことができます組合のいくつかの最大数があるでしょうこのメソッドを使用してバッチに挿入します。

または、あなたはあなたのために仕事をするターゲット表にトリガーを定義することができます:あなたのテーブルがIDという名前の主キーを持っていると想定される

CREATE TRIGGER mytrigger ON mytable 
AFTER INSERT AS 
BEGIN 
    UPDATE  mytable 
    SET  mytable.mycolumn = REPLACE(i.mycolumn, '_', ' ') 
    FROM  mytable 
    INNER JOIN inserted i 
      ON i.id = mytable.id 
      AND i.mycolumn LIKE '%[_]%' 

END 

を...。

+2

+ "WHERE mycolumn LIKE '%[_]%'"は、更新が必要な行のみを更新するため、ログと時間が大幅に軽くなります。 :) – Kahn

+0

うん、これはうまくいくかもしれない、問題はデータがインポートされる前にそれをしなければならないということなので、FeedDataSetMappingを使用して正しいフォーマットですぐに挿入し、ポスト挿入の更新を避けるのです – Tofetopo

0

XMLファイルを生成する前に、スクレイピング中のアンダースコアを(c#コードで)置き換えると、しばらく考えていました。それは私に頭痛の多くを避けるだろう。とにかくあなたの助けを借りてくれてありがとう;)

+0

SQLの質問をして、それを包括的に答えてから、あなたがタグ付けしていない、または質問で言及した技術を使ってあなた自身の質問に答えてください。 – Fred

関連する問題