Select 部分字符串并在 SQL 服务器中更新

Select part of the String and update in SQL Server

我有一个数据如下

+-------+----------------------------------------------+
| ID    | COMMENT                                      |
+-------+----------------------------------------------+
| 3118- | Replace Id.NO 3117-52-96 Was wrongly updated |
+-------+----------------------------------------------+
| 4857  | Replace Id.NO.4875-21-96-due to 2 mistake    |
+-------+----------------------------------------------+
| 5877  | replace .ID NO 5876.69.49 due mistake 101    |
+-------+----------------------------------------------+
| 1254  | Replace Id No. 1259-93-87 due to mistake 81  |
+-------+----------------------------------------------+

我想获取 No 之后和某些单词之前的值。如下所示

+-------+----------------------------------------------+------------+
| ID    | COMMENT                                      | NEW_VALUE  |
+-------+----------------------------------------------+------------+
| 3118- | Replace Id.NO 3117-52-96 Was wrongly updated | 3117-52-96 |
+-------+----------------------------------------------+------------+
| 4857  | Replace Id.NO.4875-21-96-due to mistake      | 4875-21-96 |
+-------+----------------------------------------------+------------+
| 5877  | replace .ID NO 5876.69.49 due mistake        | 5876.69.49 |
+-------+----------------------------------------------+------------+
| 1254  | Replace Id No. 1259-93-87 due to mistake     | 1259-93-87 |
+-------+----------------------------------------------+------------+

然后我必须用 NEW_VALUE 更新 ID 列。一旦我得到NEW_VALUE,更新就很容易了。

我试过的。

SELECT ID,COMMENT,
REPLACE(REPLACE(COMMENT,'Replace Id.NO',''),'Replace Id.NO.','')FROM MYTABLE

像上面一样,我使用 multiple(around 10) REPLACE 来获得我需要的值。我相信应该有一些简单的方法。

您可以使用 PATINDEX() :

SELECT mt.id, mt.COMMENT, SUBSTRING(mt.comment, PATINDEX('%[0-9]%', mt.comment)-1, 10)
FROM MYTABLE mt;

这将假设评论只有一个数字并且包含 10 个长度。

编辑:

SELECT mt.id, mt.COMMENT, SUBSTRING(mtt.comments, 1, PATINDEX('%[A-Z]%', mtt.comments)-2)
FROM MYTABLE mt CROSS APPLY
     ( VALUES (SUBSTRING(mt.comment, PATINDEX('%[0-9]%', mt.comment), LEN(mt.comment)))
     ) tt(comments)

一条建议:

SELECT V.ID,
       V.Comment,
       SUBSTRING(V.Comment,PI.I+3,CI.I) AS NewComment
FROM (VALUES(3118,'Replace Id.NO 3117-52-96 Was wrongly updated'),
            (4857,'Replace Id.NO.4875-21-96-due to 2 mistake'),
            (5877,'replace .ID NO 5876.69.49 due mistake 101'),
            (1254,'Replace Id No. 1259-93-87 due to mistake 81'))V(ID,Comment)
      CROSS APPLY (VALUES(PATINDEX('%No[ .]%', V.Comment)))PI(I)
      CROSS APPLY (VALUES(PATINDEX('%[^0-9.-]%',STUFF(V.Comment,1,PI.I+3,'')))) CI(I);

这使用PATINDEX找到'No '/'No.'的位置,然后不是[=28=的字符的第一个位置] 一些分隔符(0-9.- 字符)。

请注意,对于字符串 'Replace Id.NO.4875-21-96-due to 2 mistake',返回值 '4875-21-96-',因为值上有尾随分隔符。

理想情况下,您需要做的是在此处修复您的设计,我认为这就是您进行此操作的原因。因此,由于数据不佳,您可能需要手动 "mop up" 任何异常。