如何用SQL中的正则表达式用空格替换下划线

Tof*_*opo 1 regex sql t-sql sql-server

我正在尝试将邮政编码插入到我的数据库中,但去掉了下划线。我有一个名为 FeedDataSetMapping 的表,用于在插入字段之前映射字段:

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)
Run Code Online (Sandbox Code Playgroud)

这已经包含了一些条件正则表达式,如果这个字段包含一些文本,它会分别将其转换为 true 或 false。我需要的是一个 condition_regex 去掉这些下划线并用空格替换它,即:'GDB_A45'to 'GDB A45'。我对正则表达式了解不多,所以任何想法都将不胜感激。提前致谢!

tri*_*cot 5

SQL Server 没有太多的正则表达式支持,但在这种情况下,我认为您不需要它。你可以做一个简单的替换:

UPDATE mytable
SET    mycolumn = REPLACE(mycolumn, '_', ' ')
WHERE  mycolumn LIKE '%[_]%'
Run Code Online (Sandbox Code Playgroud)

要在更新时执行此操作,您可以使用INSERT ... SELECT代替INSERT ... VALUES

INSERT INTO mytable (mycolumn)
SELECT REPLACE('my data 1', '_', ' ') UNION
SELECT REPLACE('my data 2', '_', ' ') UNION
SELECT REPLACE('my_data_3', '_', ' ') UNION
...
Run Code Online (Sandbox Code Playgroud)

您可以执行一些最大数量的联合,因此您应该使用此方法将插入分成批次。

或者,您可以在目标表上定义一个触发器来为您完成这项工作:

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  
Run Code Online (Sandbox Code Playgroud)

...假设您的表有一个名为id的主键。

  • + "WHERE mycolumn LIKE '%[_]%'",这将减少日志和时间,因为它只会更新需要更新的行。:) (2认同)