【问题标题】:Replace semi-colon with nothing if NOT preceded by " (double quote)如果前面没有 "(双引号),则将分号替换为空
【发布时间】:2021-08-19 09:51:39
【问题描述】:

我有一个类似"Column";"Column";"Column" 的字符串。

但是,我多次看到:

"Column";"Column;";"Column"

(注意第二个字段中多余的分号)。

是否有可能找到分号 (;) 没有被双引号 (") 包围的所有实例并将其替换为空?

类似replace(@string,'[a-z][0-9];','') 的东西?

"Column";"Column;";"Column" 变成"Column";"Column";"Column"

"Value";"Value;";"Value" 变成"Value";"Value";"Value"

"Something";";Something else;";"Another ;thing"变成"Something";"Something else";"Another thing"

【问题讨论】:

  • 您需要正则表达式才能正确执行此操作,TSQL 不太擅长这种事情
  • 意义?在我的 TSQL 脚本之外?还是使用内联代码?
  • 最好在外面,但如果你想走那条路,你可以使用 SQLCLR 函数
  • Edit 你的问题,@Henrov ...
  • 恕我直言,直到您edit 您的问题来解释真正的问题是什么,进入聊天没有什么意义;信息应该在问题中,而不是聊天中。虽然我现在已经根据我的认为您的问题回答了这个问题。

标签: string tsql replace str-replace sql-server-2019


【解决方案1】:

在不知道表的定义的情况下,这是一个模糊的答案。

在 SQL Server 2017 中(如果我没记错的话),BULK INSERT 添加了对 CSV 格式的支持,这意味着您可以指定列和行分隔符 引号标识符。对于上述情况,这意味着您的FIELDTERMINATOR 需要值';',而FIELDQUOTE 需要值'"'。但是,这会留下用双引号括起来的剩余 ; 字符。

因此,我建议创建一个临时表,其中所有列都是(n)varcharBULK INSERT 将您的数据放入其中,然后将INSERT 数据放入您的生产表中,REPLACE运算符删除剩余的; 字符并强输入它们。

在伪 SQL 中,这看起来像这样:

BULK INSERT Staging.YourTable
FROM 'C:\YourFilePath\YourFile.txt'
WITH (FORMAT='CSV',
      FIELDQUOTE='"',
      FIELDTERMINATOR=';');

INSERT INTO Production.YourTable (Column1, Column2, Column3, Column4)
SELECT REPLACE(Column1,';',''),
       TRY_CONVERT(int,REPLACE(Column2,';','')),
       TRY_CONVERT(date,REPLACE(Column3,';',''),103),
       REPLACE(Column4,';','')
FROM Staging.YourTable;

【讨论】:

    【解决方案2】:

    不确定这是否过于简单,但如果你真的在 @string 中有那个字符串,那么我看不出有什么理由不应该工作:

    replace(@string, ';";"', '";"')
    

    【讨论】:

    • 确实假定分号不能出现在值的中间,并且最后一个“列”也不会包含分号。
    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2021-09-09
    • 2023-03-31
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多