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" 任何异常。
我有一个数据如下
+-------+----------------------------------------------+
| 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" 任何异常。