Одно предложение:
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.'
, а затем первую позицию символа, который не номер разделителя (0-9
или .
или -
символ).
Обратите внимание, что для строки 'Replace Id.NO.4875-21-96-due to 2 mistake'
возвращается значение '4875-21-96-'
из-за конечного разделителя на значение.
В идеале, то, что вам нужно сделать, это исправить свой дизайн здесь, и я предполагаю, что именно поэтому вы беретесь за это. В результате вам, вероятно, придется вручную «убирать» любые аномалии из-за плохих данных.